addison_lin 发表于 2012-1-12 09:19:37

android 实现可拖动的Button

    01.package com.cn.lhq;
    02.import android.app.Activity;
    03.import android.os.Bundle;
    04.import android.util.DisplayMetrics;
    05.import android.util.Log;
    06.import android.view.MotionEvent;
    07.import android.view.View;
    08.import android.view.View.OnTouchListener;
    09.import android.widget.Button;
    10.import android.widget.Toast;
    11.public class DraftTest extends Activity {
    12. @Override
    13. public void onCreate(Bundle savedInstanceState) {
    14. super.onCreate(savedInstanceState);
    15. setContentView(R.layout.main);
    16. DisplayMetrics dm = getResources().getDisplayMetrics();
    17. final int screenWidth = dm.widthPixels;
    18. final int screenHeight = dm.heightPixels - 50;
    19. final Button btn = (Button) findViewById(R.id.btn);
    20. btn.setOnTouchListener(new OnTouchListener() {
    21. int lastX, lastY;
    22. @Override
    23. public boolean onTouch(View v, MotionEvent event) {
    24. // TODO Auto-generated method stub
    25. int ea = event.getAction();
    26. Log.i(\"TAG\", \"Touch:\" + ea);
    27. switch (ea) {
    28. case MotionEvent.ACTION_DOWN:
    29. lastX = (int) event.getRawX();// 获取触摸事件触摸位置的原始X坐标
    30. lastY = (int) event.getRawY();
    31. break;
    32. case MotionEvent.ACTION_MOVE:
    33. int dx = (int) event.getRawX() - lastX;
    34. int dy = (int) event.getRawY() - lastY;
    35. int l = v.getLeft() + dx;
    36. int b = v.getBottom() + dy;
    37. int r = v.getRight() + dx;
    38. int t = v.getTop() + dy;
    39. // 下面判断移动是否超出屏幕
    40. if (l < 0) {
    41. l = 0;
    42. r = l + v.getWidth();
    43. }
    44. if (t < 0) {
    45. t = 0;
    46. b = t + v.getHeight();
    47. }
    48. if (r > screenWidth) {
    49. r = screenWidth;
    50. l = r - v.getWidth();
    51. }
    52. if (b > screenHeight) {
    53. b = screenHeight;
    54. t = b - v.getHeight();
    55. }
    56. v.layout(l, t, r, b);
    57. lastX = (int) event.getRawX();
    58. lastY = (int) event.getRawY();
    59. Toast.makeText(DraftTest.this,
    60. \"当前位置:\" + l + \",\" + t + \",\" + r + \",\" + b,
    61. Toast.LENGTH_SHORT).show();
    62. v.postInvalidate();
    63. break;
    64. case MotionEvent.ACTION_UP:
    65. break;
    66. }
    67. return false;
    68. }
    69. });
    70. }
    71.}

复制代码
package com.cn.lhq;
    import android.app.Activity;
    import android.os.Bundle;
    import android.util.DisplayMetrics;
    import android.util.Log;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.View.OnTouchListener;
    import android.widget.Button;
    import android.widget.Toast;
    public class DraftTest extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    DisplayMetrics dm = getResources().getDisplayMetrics();
    final int screenWidth = dm.widthPixels;
    final int screenHeight = dm.heightPixels - 50;
    final Button btn = (Button) findViewById(R.id.btn);
    btn.setOnTouchListener(new OnTouchListener() {
    int lastX, lastY;
    @Override
    public boolean onTouch(View v, MotionEvent event) {
    // TODO Auto-generated method stub
    int ea = event.getAction();
    Log.i(\"TAG\", \"Touch:\" + ea);
    switch (ea) {
    case MotionEvent.ACTION_DOWN:
    lastX = (int) event.getRawX();// 获取触摸事件触摸位置的原始X坐标
    lastY = (int) event.getRawY();
    break;
    case MotionEvent.ACTION_MOVE:
    int dx = (int) event.getRawX() - lastX;
    int dy = (int) event.getRawY() - lastY;
    int l = v.getLeft() + dx;
    int b = v.getBottom() + dy;
    int r = v.getRight() + dx;
    int t = v.getTop() + dy;
    // 下面判断移动是否超出屏幕
    if (l < 0) {
    l = 0;
    r = l + v.getWidth();
    }
    if (t < 0) {
    t = 0;
    b = t + v.getHeight();
    }
    if (r > screenWidth) {
    r = screenWidth;
    l = r - v.getWidth();
    }
    if (b > screenHeight) {
    b = screenHeight;
    t = b - v.getHeight();
    }
    v.layout(l, t, r, b);
    lastX = (int) event.getRawX();
    lastY = (int) event.getRawY();
    Toast.makeText(DraftTest.this,
    \"当前位置:\" + l + \",\" + t + \",\" + r + \",\" + b,
    Toast.LENGTH_SHORT).show();
    v.postInvalidate();
    break;
    case MotionEvent.ACTION_UP:
    break;
    }
    return false;
    }
    });
    }
    }
main.xml


    01.<?xml version=\"1.0\" encoding=\"utf-8\"?>
    02.<LinearLayout xmlns:android=\"http://schemas.android.com/apk/res/android\"
    03. android:orientation=\"vertical\"
    04. android:layout_width=\"fill_parent\"
    05. android:layout_height=\"fill_parent\">
    06. <Button
    07. android:text=\"推动\"
    08. android:id=\"@+id/btn\"
    09. android:layout_width=\"wrap_content\"
    10. android:layout_height=\"wrap_content\"/>
    11.</LinearLayout>
页: [1]
查看完整版本: android 实现可拖动的Button