Android Studio 移动小浮窗
菜鸟笔记,目录:
- 一、
代码实现 - 二、
View相对位置

前言:
浮现在桌面前头的小浮窗,具有可以随触摸移动,单击功能。
可以自行自定义view,在移动的过程中动画变化。
继承接口监听 View.OnTouchListener
一、代码实现:
public class load extends AppCompatActivity implements View.OnTouchListener {
@InjectView(R.id.tvlog)
TextView tvlog;
@InjectView(R.id.activity_load)
RelativeLayout activityLoad;
@InjectView(R.id.myview)
CircleView myview;
@InjectView(R.id.mypop)
CircleView mypop;
private float last_x=0, last_y=0,last_left=0,last_top=0,movx=0,movy=0;
public float scale = 1;
public static int V_SIZE = 100;
private int VIEW_SIZE = 100;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_load);
ButterKnife.inject(this); //插件ButterKnife注解控件
}
@Override
protected void onResume(){
super.onResume();
//获取屏幕分辩率,为了dp和px尺寸转换
scale = getResources().getDisplayMetrics().density;
VIEW_SIZE = (int)(V_SIZE * scale);
//初始设置一个layoutParams
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(VIEW_SIZE,VIEW_SIZE);
mypop.setLayoutParams(layoutParams);
mypop.setOnTouchListener(load.this);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
//获取触摸点下相对屏幕的位置
last_x = event.getRawX();
last_y = event.getRawY();
//获取此时控件相对父容器的位置,view的父容器是RelativeLayout activityLoad
last_left = view.getLeft();
last_top = view.getTop();
break;
case MotionEvent.ACTION_MOVE:
//计算手指触摸移动距离
movx = event.getRawX() - last_x;
movy = event.getRawY() - last_y;
if(Math.max(Math.abs(movx),Math.abs(movy)) < 8 * scale){
return false; //返回false表示事件未拦截,继续这次Event事件的传递;
// 如果返回true,则又会从ACTION_DOWN开始执行;
}
//触摸偏移量等于控件偏移量
float left = last_left + movx ;
float top = last_top + movy ;
//判断移动是否超出边框,限制在父容器边距10dp范围内移动
float view_margin = 10 * scale;
if(left < activityLoad.getLeft() + view_margin){
left = activityLoad.getLeft() + view_margin;
}
if(left > activityLoad.getRight()-VIEW_SIZE - view_margin){
left = activityLoad.getRight()-VIEW_SIZE - view_margin;
}
if(top < activityLoad.getTop() + view_margin){
top = activityLoad.getTop() + view_margin;
}
if(top > activityLoad.getBottom() - VIEW_SIZE - view_margin){
top = activityLoad.getBottom() - VIEW_SIZE - view_margin;
}
//设置新位置
RelativeLayout.LayoutParams layoutParams
= (RelativeLayout.LayoutParams) view.getLayoutParams();
layoutParams.height = VIEW_SIZE;
layoutParams.width = VIEW_SIZE;
layoutParams.leftMargin = (int)left;
layoutParams.topMargin = (int)top;
view.setLayoutParams(layoutParams);
break;
case MotionEvent.ACTION_UP:
//如果移动距离没有超过8dp就识别为点击事件
if(Math.max(Math.abs(movx),Math.abs(movy)) < 8 * scale){
mypop.invalidate();
Toast.makeText(load.this,"+1",Toast.LENGTH_SHORT).show();
}
break;
default:
break;
}
return true;
}
}
二、View相对位置
View和屏幕的位置都是从左上角(0,0)开始。以下尺寸单位都是(px),可以通过先获取屏幕像素比例来转换为dp。
- float scale =
getResources().getDisplayMetrics().density; px = dp * scale;dp = (int) px / scale;
1、View在父窗体的相对位置(单位:px)
- view.getLeft();
- view.getRight();
- view.getTop();
- view.getBottom();

2、View相对屏幕的绝对位置(单位:px)
- int[]
position= new int[2]; - view.getLocationOnScreen(
position); //方法1、包括状态栏及ActionBar - view.getLocationInWindow(
position); //方法2、忽略状态栏及ActionBar position[0] //X方向position[1] //Y方向
3.1、onTouch事件里触摸点MotionEvent相对自身View的位置(单位:px)
- event.getX();
- event.getY();
3.2、onTouch事件里触摸点MotionEvent相对屏幕的位置(单位:px)
- event.getRawX();
- event.getRawY();

本文详细介绍如何在Android Studio中创建可触摸移动的小浮窗,包括代码实现过程和View相对位置的处理,使浮窗在触摸操作下平滑移动并响应点击事件。
1676

被折叠的 条评论
为什么被折叠?



