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; } } }
时间: 2024-02-10 16:08:55 浏览: 32
这是一个实现了可拖拽效果的 Android Activity 类,其中包含了三个 ImageView,分别是背景图 backgroundImage 和两个可拖拽的图片 image1 和 image2。通过实现 View.OnTouchListener 接口,对每个 ImageView 设置触摸事件监听器 MultiTouchListener,实现了图片的拖拽效果。在 MultiTouchListener 中,通过 MotionEvent 对象获取触摸事件的类型和坐标,计算出拖拽的偏移量,再调用 v.setX() 和 v.setY() 方法实现图片的移动,最终实现了可拖拽效果。
相关问题
import android.annotation.SuppressLint;
这是一个 Android 开发中常用的导入语句,用于导入 Android 平台中的注解类 `SuppressLint`。该类用于告诉 Lint 工具,忽略指定代码段的某些特定警告或错误提示。通过使用 `SuppressLint` 注解,我们可以在代码中标记出某些被 Lint 工具认为不规范的使用方法,从而避免 Lint 工具在编译或运行时产生不必要的警告或错误提示。
如何解决Android中import androidx.annotation.NonNull;报错的问题
如果在使用Android的过程中,出现了import androidx.annotation.NonNull;报错的问题,可以尝试以下解决方法:
1. 确认你的Android Studio的版本是否符合要求。如果版本过低,可能会导致某些类库无法正常使用,需要升级到最新版本。
2. 检查你的Gradle版本是否正确。如果Gradle版本过低,也可能会导致某些类库无法正常使用,需要升级到最新版本。
3. 在你的build.gradle文件中添加以下依赖项:implementation 'androidx.annotation:annotation:1.1.0'。这个依赖项可以解决一些类库无法正常使用的问题。
4. 清除你的项目缓存。有时候,项目缓存中可能会有一些不必要的文件,导致某些类库无法正常使用。可以在Android Studio的菜单中选择File -> Invalidate Caches / Restart,然后重新编译你的项目。
如果以上方法都无法解决问题,可以尝试重新安装Android Studio,或者向Android官方论坛或社区提问求助。