Android拖动控件改变其位置

简介: mainActivity如下: package cn.dragtest; import android.app.Activity; import android.

mainActivity如下:

package cn.dragtest;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnTouchListener{
   private Button mButton;
   private ImageView mImageView;
   private DisplayMetrics displayMetrics;
   private float lastX=0;
   private float lastY=0;
   private int screenWidth=0;
   private int screenHeight=0;
   private int left;
   private int top;
   private int right;
   private int bottom;
   private boolean isFirst=true;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initView();
    }
	private void initView() {
         mButton=(Button) findViewById(R.id.button);	
         mImageView=(ImageView) findViewById(R.id.imageView);
         mButton.setOnTouchListener(this);
         mImageView.setOnTouchListener(this);
	}
	public boolean onTouch(View view, MotionEvent event) {
		if (isFirst) {
			// 得到屏幕的宽
			displayMetrics = getResources().getDisplayMetrics();
			screenWidth = displayMetrics.widthPixels;
			// 得到标题栏和状态栏的高度
			Rect rect = new Rect();
			Window window = getWindow();
			mImageView.getWindowVisibleDisplayFrame(rect);
			int statusBarHeight = rect.top;
			int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
			int titleBarHeight = contentViewTop - statusBarHeight;
			// 得到屏幕的高
			screenHeight = displayMetrics.heightPixels- (statusBarHeight + titleBarHeight);
			isFirst=false;
		}
		int action=event.getAction();
		switch (action) {
		//按下
		case MotionEvent.ACTION_DOWN:
			//按下处坐标
			lastX=event.getRawX();
			lastY=event.getRawY();
			break;
		//移动
		case MotionEvent.ACTION_MOVE:
			//移动的距离
			float distanceX=event.getRawX()-lastX;
			float distanceY=event.getRawY()-lastY;
			//移动后控件的坐标
			left=(int)(view.getLeft()+distanceX);
			top=(int)(view.getTop()+distanceY);
			right=(int)(view.getRight()+distanceX);
			bottom=(int)(view.getBottom()+distanceY);
			//处理拖出屏幕的情况
			if (left<0) {
				left=0;
				right=view.getWidth();
			}
			if (right>screenWidth) {
				right=screenWidth;
				left=screenWidth-view.getWidth();
			}
			if (top<0) {
				top=0;
				bottom=view.getHeight();
			}
			if (bottom>screenHeight) {
				bottom=screenHeight;
				top=screenHeight-view.getHeight();
			}
			//显示图片
			view.layout(left, top, right, bottom);
			lastX=event.getRawX();
			lastY=event.getRawY();
			break;
		//抬起
		case MotionEvent.ACTION_UP:
			break;
		default:
			break;
		}
		return false;
	}
}


main.xml如下:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
     >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:clickable="true"
     />
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="please drag"
        android:clickable="true"
    />
</LinearLayout>


 

相关文章
|
7小时前
|
XML Java Android开发
Android控件动态使用 (转)
Android控件动态使用 (转)
|
7小时前
|
Android开发
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
Android SystemUI去掉拖动亮度条QSPanel界面隐藏功能
10 0
|
7小时前
|
XML Java Android开发
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
Android控件之基础控件——进度条类的view——TextView、Checkbox复选控件、RadioButton单选控件、ToggleButton开关、SeekBar拖动条、menu、弹窗
|
8小时前
|
XML 编解码 Java
Android控件之高级控件——ListView、cardView、屏幕适配
Android控件之高级控件——ListView、cardView、屏幕适配
|
7小时前
|
Android开发
Android控件——Checkbox复选框、RadioButton单选、ToggleButton开关、SeekBar拖动条
Android控件——Checkbox复选框、RadioButton单选、ToggleButton开关、SeekBar拖动条
|
7小时前
|
XML Java Android开发
Android之UI基础控件
Android之UI基础控件
|
8小时前
|
Android开发
[Android]RadioButton控件
[Android]RadioButton控件
14 0
|
8小时前
|
Android开发
分享88个Android控件源代码总有一个是你想要的
分享88个Android控件源代码总有一个是你想要的
26 0
|
8小时前
|
Android开发
分享89个Android控件源代码总有一个是你想要的
分享89个Android控件源代码总有一个是你想要的
84 0
|
8小时前
|
XML Android开发 数据格式
[Android]开关控件Switch
[Android]开关控件Switch
39 0