android 事件分发机制2-案例测试
阅读原文时间:2023年07月10日阅读:1

我们来看程序的代码:

要求:

1.通过手指移动来拖动图片

2.控制图片不能超出屏幕显示区域

技术点:

1.MotionEvent处理

2.对View进行动态定位(layout)

package im.weiyuan.com.viewutils;

import android.content.Intent;
import android.os.PersistableBundle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements View.OnTouchListener{

private ImageView iv\_main;  
private RelativeLayout parentView;  
private int lastX;  
private int lastY;  
private int maxRight;  
private int maxBottom;  
@Override  
protected void onCreate(Bundle savedInstanceState) {  
    super.onCreate(savedInstanceState);  
    setContentView(R.layout.activity\_main);  
    iv\_main = (ImageView) findViewById(R.id.iv\_main);  
    parentView = (RelativeLayout) iv\_main.getParent();  

/*
int right = parentView.getRight(); //0
int bottom = parentView.getBottom(); //0
Toast.makeText(this, right+"---"+bottom, 1).show();
*/
//设置touch监听
iv_main.setOnTouchListener(this);

}

@Override  
public boolean dispatchTouchEvent(MotionEvent ev) {  
    Log.d("123456","activity dispatchTouchEvent is called" +ev.getAction());  
    return super.dispatchTouchEvent(ev);  
}

@Override  
public boolean onTouchEvent(MotionEvent event) {  
    Log.d("123456","activity onTouchEvent  is called"+event.getAction());  
    return super.onTouchEvent(event);  
}

@Override  
public boolean onTouch(View v, MotionEvent event) {  
    //得到事件的坐标  
    int eventX = (int) event.getRawX();  
    int eventY = (int) event.getRawY();  
    switch (event.getAction()) {  
        case MotionEvent.ACTION\_DOWN:  
            //得到父视图的right/bottom  
            if(maxRight==0) {//保证只赋一次值  
                maxRight = parentView.getRight();  
                maxBottom = parentView.getBottom();  
            }  
            //第一次记录lastX/lastY  
            lastX =eventX;  
            lastY = eventY;  
            break;  
        case MotionEvent.ACTION\_MOVE:  
            //计算事件的偏移  
            int dx = eventX-lastX;  
            int dy = eventY-lastY;  
            //根据事件的偏移来移动imageView  
            int left = iv\_main.getLeft()+dx;  
            int top = iv\_main.getTop()+dy;  
            int right = iv\_main.getRight()+dx;  
            int bottom = iv\_main.getBottom()+dy;  
            //限制left >=0  
            if(left<0) {  
                right += -left;  
                left = 0;  
            }  
            //限制top  
            if(top<0) {  
                bottom += -top;  
                top = 0;  
            }  
            //限制right <=maxRight  
            if(right>maxRight) {  
                left -= right-maxRight;  
                right = maxRight;  
            }  
            //限制bottom <=maxBottom  
            if(bottom>maxBottom) {  
                top -= bottom-maxBottom;  
                bottom = maxBottom;  
            }  
            iv\_main.layout(left, top, right, bottom);  
            //再次记录lastX/lastY  
            lastX = eventX;  
            lastY = eventY;  
            break;  
        default:  
            break;  
    }  
    return true;//所有的motionEvent都交给imageView处理

}  

}