public class ScaleTouchListener implements View.OnTouchListener { @SuppressLint("ClickableViewAccessibility") @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN: view.setScaleX(0.9f); view.setScaleY(0.9f); break; case MotionEvent.ACTION_UP: view.setScaleX(1); view.setScaleY(1); break; default: } return false; } }
时间: 2024-02-10 21:11:11 浏览: 150
这段代码是一个实现了缩放效果的触摸监听器类,它可以被添加到一个视图上,当用户点击或触摸这个视图时,该视图会缩小一定比例,当用户松开手指时,视图会恢复原始大小。具体来说,它重写了OnTouchListener接口的onTouch()方法,当用户按下时,会调用ACTION_DOWN分支,将视图的缩放比例设置为0.9f,当用户松开手指时,会调用ACTION_UP分支,将视图的缩放比例设置为1,表示恢复原始大小。最后,该方法返回false,表示事件未被消费,也就是其他的触摸监听器或视图可以继续处理该事件。
相关问题
package com.blog.demo11; import android.annotation.SuppressLint; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.ImageView; import androidx.annotation.Nullable; import com.blog.BaseActivity; import com.blog.R; import static android.view.MotionEvent.INVALID_POINTER_ID; /** * 可拖拽效果类。 */ public class ViewDragActivity extends BaseActivity { private ImageView backgroundImage; private ImageView image1; private ImageView image2; @SuppressLint("MissingInflatedId") @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drag_layout); backgroundImage = findViewById(R.id.background_image); image1 = findViewById(R.id.image1); image2 = findViewById(R.id.image2); // Set touch listeners for each image image1.setOnTouchListener(new MultiTouchListener()); image2.setOnTouchListener(new MultiTouchListener()); } private class MultiTouchListener implements View.OnTouchListener { private float lastTouchX, lastTouchY; private int activePointerId = INVALID_POINTER_ID; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: { final int pointerIndex = event.getActionIndex(); final float x = event.getX(pointerIndex); final float y = event.getY(pointerIndex); lastTouchX = x; lastTouchY = y; activePointerId = event.getPointerId(pointerIndex); break; } case MotionEvent.ACTION_MOVE: { final int pointerIndex = event.findPointerIndex(activePointerId); final float x = event.getX(pointerIndex); final float y = event.getY(pointerIndex); final float dx = x - lastTouchX; final float dy = y - lastTouchY; v.setX(v.getX() + dx); v.setY(v.getY() + dy); lastTouchX = x; lastTouchY = y; break; } case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: { activePointerId = INVALID_POINTER_ID; break; } case MotionEvent.ACTION_POINTER_UP: { final int pointerIndex = event.getActionIndex(); final int pointerId = event.getPointerId(pointerIndex); if (pointerId == activePointerId) { final int newPointerIndex = pointerIndex == 0 ? 1 : 0; lastTouchX = event.getX(newPointerIndex); lastTouchY = event.getY(newPointerIndex); activePointerId = event.getPointerId(newPointerIndex); } break; } } return true; } } }
这是一个实现了可拖拽效果的 Android Activity 类,其中包含了三个 ImageView,分别是背景图 backgroundImage 和两个可拖拽的图片 image1 和 image2。通过实现 View.OnTouchListener 接口,对每个 ImageView 设置触摸事件监听器 MultiTouchListener,实现了图片的拖拽效果。在 MultiTouchListener 中,通过 MotionEvent 对象获取触摸事件的类型和坐标,计算出拖拽的偏移量,再调用 v.setX() 和 v.setY() 方法实现图片的移动,最终实现了可拖拽效果。
在非activity java文件中使用onTouch监听
在非 `Activity` 的 Java 文件中使用 `OnTouchListener` 监听器,需要实现 `View.OnTouchListener` 接口,并在对应的 `View` 上设置监听器。
例如,在一个 `non-activity` 的 Java 文件中,你可以这样实现 `OnTouchListener` 接口:
```java
public class MyOnTouchListener implements View.OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
// 在这里处理触摸事件
return true;
}
}
```
然后,在你想要监听触摸事件的 `View` 上,通过 `setOnTouchListener()` 方法设置监听器:
```java
View myView = findViewById(R.id.my_view);
MyOnTouchListener myOnTouchListener = new MyOnTouchListener();
myView.setOnTouchListener(myOnTouchListener);
```
这样,在 `myView` 上的触摸事件就会被 `MyOnTouchListener` 处理。
阅读全文