更改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消耗所有的事件
}
});
}
} |
结果: |