可拖拽可点击,可吸附button(2)
来源:互联网 发布:休闲皮鞋知乎 编辑:程序博客网 时间:2024/06/04 12:21
布局
<?xml version="1.0" encoding="utf-8"?><android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="toasttest.luuuzi.clicktoastdemo.MainActivity"> <Button android:id="@+id/btn" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" /></android.support.constraint.ConstraintLayout>---------------## MainActivity代码 ##-* 这个效果类似于ios的AitiveTouch,但是不会自动吸附在屏幕边缘,* 当我们拖到什么位置时就停在什么位置,也解决了同时给按钮加上OnTouch和OnClick事件后拖动时会触发click事件的冲突,* 在程序中应用这样的一种效果还是很出彩的,实现的原理也比较简单,* 首先你得有一个按钮,其次你得把这个按钮放进一个帧布局,当然帧布局要铺满,这样按钮才能被你拖着满屏幕跑* 相比上一篇就是添加了了一个可吸附的功能,这个功能就是在手指抬起的时候让button继续显示在左右2侧,* 只需要在MotionEvent.ACTION_UP:下添加相应的代码即可,之前的代码不变,因为ACTION_MOVE事件和ACTION_UP事件都要设置button显示位置,所以,将left,right,top,bottom设置为全局的package toasttest.luuuzi.clicktoastdemo;import android.content.Context;import android.graphics.PixelFormat;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.WindowManager;import android.widget.Button;import android.widget.ImageView;import android.widget.Toast;/** */public class MainActivity extends AppCompatActivity { private Context mContext; //记录btn初始位置 int startX; int startY; //记录手指抬起后的坐标 int moveX; int moveY; //计算移动后的位置 int left; int right; int top; int bottom; //isclick这个布尔值在全局声明,是解决两种事件冲突的关键, // 因为只有当onTouch返回false的时候,click事件才会生效, // 所以我们利用isclick值来控制事件的响应,当按下的时候设其为false,倘若不移动,返回false,响应click的事件 //,如果按钮坐标发生移动就设置为true,这样在移动完按钮以后就不会同时响应OnClick事件了。 boolean isclick; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext = this; final Button btn = (Button) findViewById(R.id.btn); btn.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent motionEvent) { switch (motionEvent.getAction()) { case MotionEvent.ACTION_DOWN://按下事件,获取出事位置 isclick = false;//当按下的时候设置isclick为false //1.获取控件的初始位置 /*getX:手按下的位置和当前控件(手要移动的控件)x轴的位置 * getRawX:手按下的位置与x轴的距离 * */ //motionEvent.getX(); startX = (int) motionEvent.getRawX(); startY = (int) motionEvent.getRawY(); break; case MotionEvent.ACTION_MOVE://移动事件 isclick = true;//当按下的时候设置isclick为false //2.记录手指抬起后的位置 moveX = (int) motionEvent.getRawX(); moveY = (int) motionEvent.getRawY(); //3.计算偏移量 int disX = moveX - startX; int disY = moveY - startY; //让偏移量设置给button的位置上去 //4.移动后的控件所在屏幕的(左,上)角位置, left = btn.getLeft() + disX;//当前控件左边缘与屏幕左边缘的间距 right = btn.getRight() + disX;//右侧坐标,都是距左上角的距离 top = btn.getTop() + disY;//上边缘间距 bottom = btn.getBottom() + disY;//底部坐标 //7.容错处理 if (left < 0) { return true; } if (right > ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getWidth()) { return true; } //上边缘不能超过屏幕可显示区域 if (top < 0) { return true; } //下边缘(屏幕的高度-22(状态栏高度)) //状态栏高度没有api去拿到,只能手动去指定一个高度 if (bottom > ((WindowManager) getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getHeight() - 150) { return true; } //5.告知移动的控件按计算出来的坐标去展示 btn.layout(left, top, right, bottom); //6.重至btn的位置 startX = (int) motionEvent.getRawX(); startY = (int) motionEvent.getRawY(); break; case MotionEvent.ACTION_UP://抬起事件 //吸附在左右两边逻辑处理逻辑处理 if (left<((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getWidth()/2-btn.getWidth()){ left=0; right=left+btn.getWidth(); }else { left=((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay().getWidth()-btn.getWidth(); right=left+btn.getWidth(); } //5.告知移动的控件按计算出来的坐标去展示 btn.layout(left, top, right, bottom); //6.重至btn的位置 startX = (int) motionEvent.getRawX(); startY = (int) motionEvent.getRawY(); break; } /* * 返回值 * false:不相应事件, * true响应事件 * */ return isclick; } }); btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(mContext, "哈哈", Toast.LENGTH_SHORT).show(); } }); }}
阅读全文
1 0
- 可拖拽可点击,可吸附button(2)
- button扩大可点击范围
- 改变button可点击的工具类
- UE4 UMG自定义可点击区域Button
- HTML中jquery控制button按钮可点击、不可点击
- Android listview的item中button的点击事件 item和button 可同时点击
- 监听EditText内容变化设置Button是否可点击
- Android EditText不为空时Button才可点击
- eui.Button改变文本、背景色及是否可点击
- 可拖拽可点击的button(1)
- ListView里面添加Button之类可点击事件Item不可点击的处理方法
- AndEngine Button(2)——点击切换显示图片Button
- Button点击事件(显隐2)
- 当listview的item的布局中有Button等可点击按钮时,item的点击事件与Button的点击事件处理
- 【Demo】iOS可吸附拖动的悬浮窗按钮插件
- 点击事件 侦听事件 方法 拼图游戏的吸附
- Android 多个Edittext不为空,Button才可点击的方法
- Android防止button短时间内多次被点击(具体间隔时间可自由选取)
- jquery form validator 验证 自定义 方法
- PDF转CAD转换器好处及步骤有哪些?
- There is no getter for property named 'xx' in 'class java.lang.String
- 这7款Python工具 数据专家都应该了解
- Unreal4 入门(安装)
- 可拖拽可点击,可吸附button(2)
- NOIP1999提高组 旅行家的预算
- RecyclerView多条目
- QT5 存贮容器
- Note8预售重磅开启,多重价值回馈中国消费者
- Java系列之JDBC和ODBC之间的区别与联系
- hdu 2098 分拆素数和
- Google Chrome浏览器点击 input file上传按钮时延迟较长
- 先码后看 java的volatile关键字 侵立删