关闭

android实现可拖动按钮

2462人阅读 评论(1) 收藏 举报


个人用了感觉甚好,大赞 ~~~网址:http://www.cnblogs.com/ScorchingSun/p/3627330.html

功能:在Android中实现可拖动按钮,同时实现按钮的点击功能

相关问题:

  1. 按钮拖动的界限限定。
  2. 按钮单击和拖动之间的冲突。
  3. 在界面未显示之前,获得View的高/宽。

问题描述:

  1. 如果不为按钮的拖动范围设定界限,按钮将可以被拖出触摸屏,影响操作。如果程序实现了位置的记录功能(这里暂不实现),当按钮的显示范围超出显示屏时,按钮可能会变形。
  2. 在拖动的时间中,程序将会首先触发事件的顺序为:ACTION_DOWN -> ACTION_MOVE -> ACTION_UP,在触发ACTION_DOWN时,系统将会在ACTION_UP结束后,触发按钮被点击的事件(按钮点击事件被触发的条件略),造成拖动事件和单机事件之间的冲突。
  3. 在Activity的onCreate()中,各个View并未被重画,所以不过调用View.getHeight()还是调用View.getMeasuredHeight(),所得到的结果都为0。只有在onDraw中,View将会被重画,但是此时往往对程序来说,获取数据有显得太晚。

解决方法:

  1. 通过对按钮实现setOnTouchListener()监听器,来使得按钮可以被任意拖动,在监听器中的ACTION_MOVE事件的处理中,对按钮实现重画和对拖动的界限的限定。
  2. 通过取得ACTION_UP与ACTION_DOWN之间按钮的位移来确定按钮所应该触发的事件,并通过设定位移的大小来避免误操作。
  3. 通过获取界面中的ViewTree的监听器,来获得在View被重画前,它被测量出的高/宽。

源代码:

  1.布局文件(activity_main.xml)

______________________________________________________________________________________________________

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
tools:context=".MainActivity" >

<Button
android:id="@+id/movebtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />

</RelativeLayout>

______________________________________________________________________________________________________

  2.界面代码(MainActivity.java)

______________________________________________________________________________________________________

package com.luxl.slideandtouch;

import android.os.Bundle;
import android.app.Activity;
import android.util.DisplayMetrics;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.view.Window;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

private Button movebtn;        //可拖动按钮
private boolean clickormove = true;  //点击或拖动,点击为true,拖动为false
private int downX, downY;      //按下时的X,Y坐标
private boolean hasMeasured = false;  //ViewTree是否已被测量过,是为true,否为false
private View content;          //界面的ViewTree
private int screenWidth,screenHeight;  //ViewTree的宽和高

@Override
protected void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

content = getWindow().findViewById(Window.ID_ANDROID_CONTENT);//获取界面的ViewTree根节点View

DisplayMetrics dm = getResources().getDisplayMetrics();//获取显示屏属性
screenWidth = dm.widthPixels;
screenHeight = dm.heightPixels;

ViewTreeObserver vto = content.getViewTreeObserver();获取ViewTree的监听器
vto.addOnPreDrawListener(new OnPreDrawListener() {

@Override
public boolean onPreDraw() {

// TODO Auto-generated method stub
if(!hasMeasured)
{

screenHeight = content.getMeasuredHeight();//获取ViewTree的高度
hasMeasured = true;//设置为true,使其不再被测量。

}
return true;//如果返回false,界面将为空。

}

});
movebtn = (Button) findViewById(R.id.movebtn);
movebtn.setOnTouchListener(new OnTouchListener() {//设置按钮被触摸的时间

int lastX, lastY; // 记录移动的最后的位置

@Override
public boolean onTouch(View v, MotionEvent event) {

// TODO Auto-generated method stub
int ea = event.getAction();//获取事件类型
switch (ea) {
case MotionEvent.ACTION_DOWN: // 按下事件

lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
downX = lastX;
downY = lastY;
break;

case MotionEvent.ACTION_MOVE: // 拖动事件

// 移动中动态设置位置
int dx = (int) event.getRawX() - lastX;//位移量X
int dy = (int) event.getRawY() - lastY;//位移量Y
int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;

//++限定按钮被拖动的范围
if (left < 0) {

left = 0;
right = left + v.getWidth();

}
if (right > screenWidth) {

right = screenWidth;
left = right - v.getWidth();

}
if (top < 0) {

top = 0;
bottom = top + v.getHeight();

}
if (bottom > screenHeight) {

bottom = screenHeight;
top = bottom - v.getHeight();

}

//--限定按钮被拖动的范围

v.layout(left, top, right, bottom);//按钮重画


// 记录当前的位置
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;

case MotionEvent.ACTION_UP: // 弹起事件

  //判断是单击事件或是拖动事件,位移量大于5则断定为拖动事件

if (Math.abs((int) (event.getRawX() - downX)) > 5
|| Math.abs((int) (event.getRawY() - downY)) > 5)

clickormove = false;

else

clickormove = true;

break;

}
return false;

}

});
movebtn.setOnClickListener(new OnClickListener() {//设置按钮被点击的监听器

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
if (clickormove)

Toast.makeText(MainActivity.this, "single click",
Toast.LENGTH_SHORT).show();

}

});

}

}

1
0
查看评论

Android 可拖动的悬浮按钮

这是控件的主代码,在你的项目里面,新建一个同名的类,把代码直接复制进去就能用了。另外,这个类里面引用了工具类的一些代码。工具类在这个主类的源码下面也有贴出,直接把工具类的相关代码,复制到你自己的工具类里就行了,有问题可以加我QQ咨询:326257241。
  • l_o_s
  • l_o_s
  • 2017-03-01 15:01
  • 3958

android 超简单的拖动按钮 悬浮按钮 吸附按钮

android 超简单的拖动按钮 悬浮按钮 吸附按钮
  • menglele1314
  • menglele1314
  • 2015-11-13 12:26
  • 13549

Android 可拖动的悬浮按钮

这是控件的主代码,在你的项目里面,新建一个同名的类,把代码直接复制进去就能用了。另外,这个类里面引用了工具类的一些代码。工具类在这个主类的源码下面也有贴出,直接把工具类的相关代码,复制到你自己的工具类里就行了,有问题可以加我QQ咨询:326257241。 /** * @ClassName: F...
  • mr_jianrong
  • mr_jianrong
  • 2018-01-06 16:54
  • 49

android拖动控件,解决回到原点,拖动自动靠边,点击不灵敏

  • 2016-03-25 19:05
  • 3.11MB
  • 下载

android 可拖动控件 ontouchevent

Android MotionEvent详解 字数2398 阅读2990 评论14 喜欢38  在前边几篇博文中(《图解Android事件传递之ViewGroup篇》,《图解Android事件传递之View篇》),我们已经了解了android触摸事件传递机...
  • kdsde
  • kdsde
  • 2016-09-19 17:45
  • 576

Android实现可拖动的悬浮按钮控件

Android自定义可拖动控件
  • SonnyJack
  • SonnyJack
  • 2018-01-18 22:10
  • 265

安卓UI控件拖拽的几种方法

上一篇简单的讲解了安卓listview控件的一些简单的用法,这一次我们按照群英传的思路看一看安卓UI控件拖拽的实现方法。 安卓控件的拖拽(这里用词可能不太专业)可归纳为一下几个动作:1.普通拖拽,改变控件位置;2.放大缩小;3.滑动。下面我们来仔细的看 1.知识准备 滑动效果的产生: 移动界面上...
  • u010921701
  • u010921701
  • 2016-05-10 16:27
  • 1715

android控件拖动,移动、解决父布局重绘时控件回到原点

这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置 // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷新时)则移动的view会回到原来的位置 RelativeLayout.LayoutParam...
  • zhongwn
  • zhongwn
  • 2016-01-14 19:52
  • 4101

Android实现可移动的自定义浮动按钮

android自定义浮动按钮,FloatactionBar的移动效果,可实现浮动按钮的文字展示或隐藏效果,可以控制可移动或者不可移动,标题的颜色,按钮的背景,实现按钮的长按移动或者即时移动。
  • u010712703
  • u010712703
  • 2017-04-13 16:07
  • 1719

安卓控件拖动和点击事件冲突处理----可拖动的FloatingActionButton

直接上代码,具体为什么自行百度吧。额。。就是这么任性? /** * Created by ${davidMa} on 2017/5/23. * com.aochuang.megstar.widget * 描述: * 公司:aochuang01 */ public class MyFloa...
  • cange521
  • cange521
  • 2017-05-29 17:02
  • 814
    个人资料
    • 访问:11710次
    • 积分:247
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:19篇
    • 译文:0篇
    • 评论:1条
    最新评论