Android控件拖动的实现

这个也是从网上得到的代码,例子比较简单,但是如果有需要此功能的,这个例子可以提供很多提示,首先,给个截图

这个是拖动以后的效果,一个imageview和一个button控件,提供两份代码下载吧,一份是只有一个Button的,另一份就是像上图,就是多了一个imagview!先看下代码吧,比较简单:

  1. public class DraftTest extends Activity implements OnTouchListener{
  2. /** Called when the activity is first created. */
  3. int screenWidth;
  4. int screenHeight;
  5. int lastX;
  6. int lastY;
  7. @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. super.onCreate(savedInstanceState);
  10. setContentView(R.layout.main);
  11. DisplayMetrics dm = getResources().getDisplayMetrics();
  12. screenWidth = dm.widthPixels;
  13. screenHeight = dm.heightPixels - 50;
  14. Button button=(Button)findViewById(R.id.btn);
  15. ImageView imageView=(ImageView)findViewById(R.id.btn2);
  16. imageView.setOnTouchListener(this);
  17. button.setOnTouchListener(this);
  18. }
  19. @Override
  20. public boolean onTouch(View v, MotionEvent event) {
  21. // TODO Auto-generated method stub
  22. int action=event.getAction();
  23. Log.i("@@@@@@", "Touch:"+action);
  24. //Toast.makeText(DraftTest.this, "λ?ã?"+x+","+y, Toast.LENGTH_SHORT).show();
  25. switch(action){
  26. case MotionEvent.ACTION_DOWN:
  27. lastX = (int) event.getRawX();
  28. lastY = (int) event.getRawY();
  29. break;
  30. /**
  31. * layout(l,t,r,b)
  32. * l  Left position, relative to parent
  33. t  Top position, relative to parent
  34. r  Right position, relative to parent
  35. b  Bottom position, relative to parent
  36. * */
  37. case MotionEvent.ACTION_MOVE:
  38. int dx =(int)event.getRawX() - lastX;
  39. int dy =(int)event.getRawY() - lastY;
  40. int left = v.getLeft() + dx;
  41. int top = v.getTop() + dy;
  42. int right = v.getRight() + dx;
  43. int bottom = v.getBottom() + dy;
  44. if(left < 0){
  45. left = 0;
  46. right = left + v.getWidth();
  47. }
  48. if(right > screenWidth){
  49. right = screenWidth;
  50. left = right - v.getWidth();
  51. }
  52. if(top < 0){
  53. top = 0;
  54. bottom = top + v.getHeight();
  55. }
  56. if(bottom > screenHeight){
  57. bottom = screenHeight;
  58. top = bottom - v.getHeight();
  59. }
  60. v.layout(left, top, right, bottom);
  61. Log.i("@@@@@@", "position??" + left +", " + top + ", " + right + ", " + bottom);
  62. lastX = (int) event.getRawX();
  63. lastY = (int) event.getRawY();
  64. break;
  65. case MotionEvent.ACTION_UP:
  66. break;
  67. }
  68. return false;
  69. }
  70. }

高度减去50是减去状态栏和标题栏的高度。

  1. case MotionEvent.ACTION_DOWN:
  2. lastX = (int) event.getRawX();
  3. lastY = (int) event.getRawY();
  4. break;

然后获取控件一开始的位置,然后在ACTION_MOVIE中:

  1. int dx =(int)event.getRawX() - lastX;
  2. int dy =(int)event.getRawY() - lastY;
  3. int left = v.getLeft() + dx;
  4. int top = v.getTop() + dy;
  5. int right = v.getRight() + dx;
  6. int bottom = v.getBottom() + dy;
  7. if(left < 0){
  8. left = 0;
  9. right = left + v.getWidth();
  10. }
  11. if(right > screenWidth){
  12. right = screenWidth;
  13. left = right - v.getWidth();
  14. }
  15. if(top < 0){
  16. top = 0;
  17. bottom = top + v.getHeight();
  18. }
  19. if(bottom > screenHeight){
  20. bottom = screenHeight;
  21. top = bottom - v.getHeight();
  22. }
  23. v.layout(left, top, right, bottom);
  24. Log.i("@@@@@@", "position??" + left +", " + top + ", " + right + ", " + bottom);
  25. lastX = (int) event.getRawX();
  26. lastY = (int) event.getRawY();

getLeft()方法得到的是控件左边坐标距离父控件原点(左上角,坐标(0,0))的y轴距离,getRight()是控件右边距离父控件原点的y轴距离,同理,getTop和getButtom是距离的x轴距离。

[java] view plaincopy

  1. if(left < 0){
  2. left = 0;
  3. right = left + v.getWidth();
  4. }
  5. if(right > screenWidth){
  6. right = screenWidth;
  7. left = right - v.getWidth();
  8. }
  9. if(top < 0){
  10. top = 0;
  11. bottom = top + v.getHeight();
  12. }
  13. if(bottom > screenHeight){
  14. bottom = screenHeight;
  15. top = bottom - v.getHeight();
  16. }

这里的判断是为了是控件不超出屏幕以外,即:到达边界以后,不能再移动。

  1. v.layout(left, top, right, bottom);

设置View的位置。

有一点忘记说了,就是像ImageView和TextView这些控件,要想实现拖动,要在xml文件中设置它的clickable为true。

[java] view plaincopy

  1. android:clickable="true"

就这样,这些就是这个demo的全部内容。

最后,是代码的下载地址:

http://download.csdn.net/detail/aomandeshangxiao/4187376,

http://download.csdn.net/detail/aomandeshangxiao/4189910

时间: 2024-10-16 13:54:32

Android控件拖动的实现的相关文章

android控件开发之SeekBar

android控件开发之SeekBar 本博文主要讲述的是SeekBar的使用,此控件在播放器中使用时相当的广泛.下面我们直接来看看代码吧! mainActivity.java: package com.example.seekbar; import android.os.Bundle; import android.app.Activity; import android.view.Menu; import android.widget.SeekBar; public class MainAc

Android控件介绍

Android控件介绍 多选按钮(CheckBox) CheckBox有两个常用的事件,OnClickListener事件和OnClickChangeListener事件 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_w

Android控件(2)RadioButton&amp;RadioGroup

抄自: http://www.cnblogs.com/wt616/archive/2011/06/20/2085531.html 学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握RadioGroup选中状态变换的事件(监听器) RadioButton和CheckBox的区别: 1.单个RadioButton在选中后,通过点击无法变为未选中 单个Che

Android 控件的触摸事件传递与处理

了解Android控件的触摸事件传递与处理对我们日常开发中自定义控件和触摸事件冲突解决有重大意义.Android控件的触摸事件传递和处理主要有以下几个方法,下面一一介绍. 一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev);                                                                                               接收到触摸事件时,是否

Android 控件:使用下拉列表框--Spinner

---恢复内容开始--- 一.前段代码 <Spinner android:id="@+id/spin" android:paddingTop="10px" android:layout_width="fill_parent" android:layout_height="50sp"/> <Button android:id="@+id/addList" android:layout_wid

android控件篇:ViewPager+Fragment+GridView的使用(与AndroidQuery框架结合)

最近看了一个AndroidQuery的框架,里面的Demo,有个界面,让博主很喜欢.左右滑动十分顺畅,手感很好,于是拿来和大家分享一下.先看一下效果图: 从图中可以看出,上面的布局是一个Layout里面嵌套有个ViewPager,ViewPager中包含着Fragment,Fragment的布局文件包含了一个简单的GridView,GridView的Item布局很简单,就是一个100*100大小的图片.好啦,先说这么多,然后咱们看代码吧. 最外层Activity的布局文件 <?xml versi

Android 控件布局常用属性

<!--单个控件经常用到android:id -- 为控件指定相应的IDandroid:text -- 指定控件当中显示的文字,需要注意的是,这里尽量使用strings.xml文件当中的字符串android:grivity -- 指定控件的基本位置,比如说居中,居右等位置android:textSize -- 指定控件当中字体的大小android:background -- 指定该控件所使用的背景色,RGB命名法 android:width -- 指定控件的宽度android:height --

Android控件上添加图片

项目中有一个点赞功能,点赞的小图标添加在点赞列表旁边,在xml里可以进行设置,也可以在代码中进行绘图. 下面是两种方法的设置: 1.xml里:一些控件:button.textView等等里面有个属性是android:drawableLeft 就可以将pic设置到text的左边.good.... 2.代码中: TextView txtlikedList = new TextView(this.getContext()); Drawable drawable= getResources().getD

Android控件常见属性

1.宽/高android:layout_width android:layout_height// 取值match_parent //匹配父控件wrap_content //自适应,根据内容 如果指定宽度,请用单位dp 2.控件在父控件中的对齐位置android:layout_gravity 3.控件中文本的对齐方式android:gravity 4.控件内元素的排列方式android:orientation 取值:horizontal 水平 vertical 垂直 5.文字大小 android