来自老外:
拖拽图片效果
方法一:
方法二:
拖动按钮到处跑
1. 布局文件
2. 代码
另一种:
再一个,浮动按钮的实现。
主要功能:
点击按钮可以进行拖动;
当点击按钮时按钮会出现于所有按钮的最上方;
import android.app.Activity; import android.content.Context; import android.graphics.Canvas; import android.os.Bundle; import android.view.MotionEvent ; import android.widget.AbsoluteLayout; import android.widget.Button; public class Drag_And_Drop extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle icicle) { super.onCreate(icicle); MyView tx = new MyView(this); tx.setText("Drag Me"); AbsoluteLayout l = new AbsoluteLayout(this); AbsoluteLayout.LayoutParams p = new AbsoluteLayout.LayoutParams( AbsoluteLayout.LayoutParams.WRAP_CONTENT, AbsoluteLayout.LayoutParams.WRAP_CONTENT,10,10); l.addView(tx,p); setContentView(l); } } class MyView extends Button{ public MyView(Context c){ super(c); } @Override public boolean onMotionEvent(MotionEvent event) { int action = event.getAction(); int mCurX = (int)event.getX(); int mCurY = (int)event.getY(); if ( action == MotionEvent.ACTION_MOVE ) { //this.setText("x: " + mCurX + ",y: " + mCurY ); AbsoluteLayout.LayoutParams p = new AbsoluteLayout.LayoutParams(AbsoluteLayout.LayoutParams.WRAP_CONTENT, AbsoluteLayout.LayoutParams.WRAP_CONTENT,this.mLeft + mCurX,this.mTop + mCurY); this.setLayoutParams (p); } if ( action == MotionEvent.ACTION_UP ) { //this.setText("not moving"); } return true; } @Override public void draw(Canvas canvas) { // TODO Auto-generated method stub super.draw(canvas); } }
拖拽图片效果
方法一:
import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class DragSample01 extends Activity { ImageView img; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drag_sample01); img = (ImageView)findViewById(R.id.img_view); img.setOnTouchListener(new OnTouchListener(){ private int mx, my; public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_MOVE: mx = (int)(event.getRawX()); my = (int)(event.getRawY() - 50); v.layout(mx - img.getWidth()/2, my - img.getHeight()/2, mx + img.getWidth()/2, my + img.getHeight()/2); break; } return true; }}); } }
方法二:
import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; public class DragSample01 extends Activity { ImageView img; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.drag_sample01); img = (ImageView)findViewById(R.id.img_view); img.setOnTouchListener(new OnTouchListener(){ private float x, y; private int mx, my; public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: x = event.getX(); y = event.getY(); case MotionEvent.ACTION_MOVE: mx = (int)(event.getRawX() - x); my = (int)(event.getRawY() - 50 - y); v.layout(mx, my, mx + v.getWidth(), my + v.getHeight()); break; } return true; }}); } }
拖动按钮到处跑
1. 布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:id="@+id/btn" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="拖动看看~~" /> </LinearLayout>
2. 代码
import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; public class DraftTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Button btn = (Button) findViewById(R.id.btn); btn.setOnTouchListener(new OnTouchListener() { int[] temp = new int[] { 0, 0 }; public boolean onTouch(View v, MotionEvent event) { int eventaction = event.getAction(); int x = (int) event.getRawX(); int y = (int) event.getRawY(); switch (eventaction) { case MotionEvent.ACTION_DOWN: // touch down so check if the temp[0] = (int) event.getX(); temp[1] = y - v.getTop(); break; case MotionEvent.ACTION_MOVE: // touch drag with the ball v.layout(x - temp[0], y - temp[1], x + v.getWidth() - temp[0], y - temp[1] + v.getHeight()); // v.postInvalidate(); break; case MotionEvent.ACTION_UP: break; } return false; } }); } }
另一种:
import android.app.Activity; import android.os.Bundle; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.Button; public class DraftTest extends Activity { /** Called when the activity is first created. */ 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 b = (Button) findViewById(R.id.btn); b.setOnTouchListener(new OnTouchListener() { int lastX, lastY; public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) { case MotionEvent.ACTION_DOWN: lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: int dx = (int) event.getRawX() - lastX; int dy = (int) event.getRawY() - lastY; 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: break; } return false; } }); } }
再一个,浮动按钮的实现。
主要功能:
点击按钮可以进行拖动;
当点击按钮时按钮会出现于所有按钮的最上方;
import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.os.Bundle; import android.text.style.AbsoluteSizeSpan; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnTouchListener; import android.widget.AbsoluteLayout; import android.widget.Button; public class HelloWorld2 extends Activity { /** Called when the activity is first created. */ AbsoluteLayout mLayoutGroup = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); mLayoutGroup = new AbsoluteLayout(this); AbsoluteLayout.LayoutParams layoutParams = new AbsoluteLayout.LayoutParams (320, 480, 0, 0); setContentView(mLayoutGroup, layoutParams); Button button= new Button(this); button.setText("testButton"); layoutParams = new AbsoluteLayout.LayoutParams(120, 60, 20, 20); mLayoutGroup.addView(button, layoutParams); button.setOnClickListener(new OnClickListener() { public void onClick(View arg0) { // TODO Auto-generated method stub //alert(); } }); button.setOnTouchListener(touchListener); final Button btButton = new Button(this); btButton.setText("测试按钮移动"); layoutParams = new AbsoluteLayout.LayoutParams(120, 60, 20, 160); mLayoutGroup.addView(btButton, layoutParams); btButton.setOnTouchListener(touchListener); } OnTouchListener touchListener = new OnTouchListener() { int temp[] = new int[]{0, 0}; public boolean onTouch(View arg0, MotionEvent arg1) { // TODO Auto-generated method stub int eventAction = arg1.getAction(); Log.e("testButtonMove", "OnTouchAction:"+eventAction); int x = (int)arg1.getRawX(); int y = (int)arg1.getRawY(); switch (eventAction) { case MotionEvent.ACTION_DOWN: temp[0] = (int)arg1.getX(); temp[1] = (int)(y-arg0.getTop()); mLayoutGroup.bringChildToFront(arg0); arg0.postInvalidate(); break; case MotionEvent.ACTION_MOVE: int left = x - temp[0]; int top = y - temp[1]; int right = left + arg0.getWidth(); int bottom = top + arg0.getHeight(); arg0.layout(left, top, right, bottom); arg0.postInvalidate(); break; default: break; } return false; } }; void alert() { new AlertDialog.Builder(this) .setNeutralButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface arg0, int arg1) { // TODO Auto-generated method stub } }) .setTitle("test button") .setMessage("test test test!!!") .show(); } }