[mobilesafe] 12_更改Toast显示的位置-触摸移动

Android 4.0

更改Toast显示的位置

1、毛玻璃效果
API Demos→App→Activity→Translucent
要使用直接在清单文件中的Activity中进行配置theme,高版本中不支持,不安全
2、getRawX()和getX()区别(RawX、X  getRawX、getX)
getRawX()、getRawY() 这一点距离原点X、Y的距离
getX()、getY()这一点距离触摸控件的x和y距离
3、触摸事件和点击事件区别(面试题)
4、getLeft()、getRight()、getTop()、getButtom()
getLeft():组件最左边距离手机的长度
getRight():组件最右边距离手机的长度
getTop():组件最上边距离组件的长度
getButtom():组件最下边距离组件的长度

步骤:
1、定义一个Activity,指定毛玻璃效果
 <activity android:name="com.itheima.mobilesafe.DragViewActivity"
            android:theme="@android:style/Theme.Translucent.NoTitleBar"
  ></activity>  
2、在这上面定义一个按钮,用来实现拖动的效果
3、在SettingActivity中意图开启到该Activity上,给该按钮注册触摸事件,实现拖动效果
a) 注册触摸事件setOnTouchListener
b) 在刚触摸到组件MotionEvent.ACTION_DOWN,记住组件的起始位置
c) 在触摸移动的时候,获取触摸的位置,将触摸的位置和起始位置进行相减,得到差
d) 再获取该组件四个边距离手机的位置,然后将差在对应的边上做加减
e) 最后将起始位置记录到手松开的那点
iv_dragview.setOnTouchListener(new OnTouchListener() {
    float startX = 0;
    float startY = 0;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:// 触摸按下
            startX = event.getRawX();
            startY = event.getRawY();
            break;
        case MotionEvent.ACTION_MOVE:// 移动
            float nowX = event.getRawX();
            float nowY = event.getRawY();
            
            float dx = nowX - startX;
            float dy = nowY - startY;
            int left = (int) (iv_dragview.getLeft() + dx);
            int right = (int) (iv_dragview.getRight() + dx);
            int top = (int) (iv_dragview.getTop() + dy);
            int bottom = (int) (iv_dragview.getBottom() + dy);
            
            iv_dragview.layout(left, top, right, bottom);// 重新设置iv_dragview的位置
            startX = left;
            startY = top;
            break;
        case MotionEvent.ACTION_UP:// 松手瞬间
            break;
        }
        return true;// 要返回true,才能consume消耗所有的事件
    }
核心代码:
package cn.zengfansheng.mobilesafe;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
/**
 * 13、拖动改变位置的Activity-Toast显示位置改变
 * @author hacket
 */
public class DragViewActivity extends Activity {
    private ImageView iv_dragview;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dragview);
        iv_dragview = (ImageView) this.findViewById(R.id.iv_dragview);
        iv_dragview.setOnTouchListener(new OnTouchListener() {
            float startX = 0;
            float startY = 0;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:// 触摸按下
                    startX = event.getRawX();
                    startY = event.getRawY();
                    break;
                case MotionEvent.ACTION_MOVE:// 移动
                    float nowX = event.getRawX();
                    float nowY = event.getRawY();
                    
                    float dx = nowX - startX;
                    float dy = nowY - startY;
                    int left = (int) (iv_dragview.getLeft() + dx);
                    int right = (int) (iv_dragview.getRight() + dx);
                    int top = (int) (iv_dragview.getTop() + dy);
                    int bottom = (int) (iv_dragview.getBottom() + dy);
                    
                    iv_dragview.layout(left, top, right, bottom);// 重新设置iv_dragview的位置
                    startX = left;
                    startY = top;
                    break;
                case MotionEvent.ACTION_UP:// 松手瞬间
                    break;
                }
                return true;// 要返回true,才能consume消耗所有的事件
            }
        });
    }
}
结果: