在一个activity页面要实现这种效果是很简单的,最好布局是RelativeLayout作为根布局,然后把一个想要移动的View,比如ImageView,ImageButton,TextView等等放到根布局下 在这里的点击效果并没有利用onClick,只是通过手指弹起来判断是否是属于点击而已。
布局
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.amei.moveviewproject.MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="触摸移动左上角的图片" />
<ImageView
android:id="@+id/move_image"
android:layout_width="80dp"
android:layout_height="80dp"
android:src="@mipmap/ic_launcher"
/>
</RelativeLayout>
主页面MainActivity
public class MainActivity extends AppCompatActivity {
private ImageView moveImage;
private RelativeLayout mRelativeLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
moveImage.setOnTouchListener(onTouchListener);
}
private void initView() {
moveImage = (ImageView) findViewById(R.id.move_image);
mRelativeLayout = (RelativeLayout) findViewById(R.id.activity_main);
}
/**
* 是否移动过
*/
private boolean isMove;
private float mLastX;
private float mLastY;
private float mStartX;
private float mStartY;
private long mLastTime ;
private long mCurrentTime;
private View.OnTouchListener onTouchListener = new View.OnTouchListener() {
int lastX;
int lastY;
int left;
int top;
int right;
int bottom;
int screenWidth;
int screenHeight;
@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getAction();
switch (action) {
case MotionEvent.ACTION_DOWN:
isMove = false;
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
mStartX = event.getRawX();
mStartY = event.getRawY();
mLastTime = System.currentTimeMillis();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;
screenWidth = mRelativeLayout.getWidth();
screenHeight = mRelativeLayout.getHeight();
if (dx != 0 || dy != 0) {
isMove = true;
}
left = v.getLeft() + dx;
top = v.getTop() + dy;
right = v.getRight() + dx;
bottom = v.getBottom() + dy;
if (left < 0) {
left = 0;
right = left + v.getWidth();
}
if (right > screenWidth) {
right = screenWidth;
left = right - v.getWidth();
}
if (top < 0) {
top = 0;
bottom = top + v.getHeight();
}
if (bottom > screenHeight) {
bottom = screenHeight;
top = bottom - v.getHeight();
}
v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_UP:
if(left <= (screenWidth / 2)) {
left = 0;
}else{
left = screenWidth - moveImage.getWidth();
}
v.layout(left, top, right, bottom);
Rect vRect = new Rect();
v.getHitRect(vRect);
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) v
.getLayoutParams();
lp.leftMargin = vRect.left;
lp.topMargin = vRect.top;
v.setLayoutParams(lp);
mLastX = event.getRawX();
mLastY = event.getRawY();
mCurrentTime = System.currentTimeMillis();
if(mCurrentTime - mLastTime < 800){//长按不起作用
Log.d("kitchee","开始Y="+mStartY);
Log.d("kitchee","最后Y="+mLastY);
Log.d("kitchee","移动Y="+Math.abs(mStartY - mLastY));
if(Math.abs(mStartX- mLastX )< 10.0 && Math.abs(mStartY - mLastY) < 10.0){//判断是否属于点击
Toast.makeText(MainActivity.this,"可以执行点击任务",Toast.LENGTH_SHORT).show();
}
}
break;
default:
break;
}
return true;
}
};
}