第七章:Android Studio(移动浮窗)

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

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();
    图片引用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值