可拖拽可点击的button(1)
来源:互联网 发布:手机实用软件大全 编辑:程序博客网 时间:2024/06/03 07:25
/*实现可拖拽,可点击的button* 这个效果类似于ios的AitiveTouch,但是不会自动吸附在屏幕边缘,* 当我们拖到什么位置时就停在什么位置,也解决了同时给按钮加上OnTouch和OnClick事件后拖动时会触发click事件的冲突,* 在程序中应用这样的一种效果还是很出彩的,实现的原理也比较简单,* 首先你得有一个按钮,其次你得把这个按钮放进一个帧布局,当然帧布局要铺满,这样按钮才能被你拖着满屏幕跑* */public class MainActivity extends AppCompatActivity { private Context mContext; //记录btn初始位置 int startX; int startY; //记录手指抬起后的坐标 int moveX; int moveY; //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.移动后的控件所在屏幕的(左,上)角位置, int left = btn.getLeft() + disX;//当前控件左边缘与屏幕左边缘的间距 int top = btn.getTop() + disY;//上边缘间距 int right = btn.getRight() + disX;//右侧坐标,都是距左上角的距离 int 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://抬起事件 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(1)
- Button的点击事件
- Button的点击事件
- Button的点击倒计时
- Button的点击事件
- Button的点击事件
- Android Button的点击事件
- 增加button的点击面积
- 扩大Button的点击区域
- button按钮的点击状态
- button 鼠标点击的处理
- 防止Button的频繁点击
- button 点击的涟漪效果
- android 实现button的点击
- 点击ListView的Button修改Button本身的背景
- [Android][Button]Button注册点击事件的4种方法
- <button> 元素点击后刷新的问题
- 通过代码实现button的点击效果
- JavaScript md5 加密
- 在C#中简单的科学计算,包括幂数,指数,对数,Math类
- 职称论文发表格式要求
- 1Qt图片编程总结
- Android加载so文件报java.lang.UnsatisfiedLinkError: has text relocations
- 可拖拽可点击的button(1)
- HashMap原理
- markdown编辑器
- DbParameter 类 DBType无RefCursor数据类型
- matlab截取图像一部分
- vue学习总结(1)
- 计蒜客 The Heaviest Non-decreasing Subsequence Problem dp LIS变形 || 线段树+dp
- PHP大小写敏感规则
- java.lang.RuntomeException: lib/arm64-v8a/路径下没有libinet.2.0.1.so