`

android 拖拽图片&拖动浮动按钮到处跑

阅读更多
来自老外:
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();
    }
    
    
}



  • 大小: 11.6 KB
分享到:
评论
5 楼 xinyuetonghua 2012-05-03  
请教下,怎么解决同一个按钮的OnTouchListener()事件和onclick事件的冲突问题?
4 楼 songyu719 2011-10-22  
这个必须使用绝对布局吧!
3 楼 yelwen000 2011-06-21  
是不是只有button 能移动 的啊
Layout移动就不行了[e01]
[b][/b][color=red][/color]
2 楼 yelwen000 2011-06-21  
是不是只有button 能移动 的啊
Layout移动就不行了[e01]
1 楼 tanghanlin 2011-04-03  
怎么没效果

相关推荐

    android 拖拽图片 拖动浮动按钮到处跑

    本文将详细介绍如何实现“拖拽图片”和“拖动浮动按钮到处跑”的功能。 首先,我们需要在`onCreate`方法中初始化屏幕尺寸,以便在拖动过程中限制按钮或图片的边界。这可以通过获取`DisplayMetrics`对象来实现: ``...

    android拖动图片拖动浮动按钮[归纳].pdf

    本篇将探讨如何在Android应用中实现图片和浮动按钮的拖动功能,主要涉及两个示例:一个使用`AbsoluteLayout`的按钮拖动,另一个是基于`ImageView`的图片拖动。 首先,我们来看如何实现拖动浮动按钮的功能。这里使用...

    android和Kotlin的可拖拽悬浮控件/可拖拽悬浮按钮带附件下载

    * 可拖拽的悬浮控件按钮 * 自动吸附左右边框 * 直接xml布局里引用即可。 * 要设置setOnClickListener点击事件,即可实现拖拽和点击功能。 * 尺寸大小,样式及背景图片遵循ImageView即可。 原文有介绍有动态介绍图...

    Android 拖拽悬浮按钮

    下面将详细讨论Android拖拽悬浮按钮的实现原理、关键代码和相关知识点。 一、浮动动作按钮(Floating Action Button) Floating Action Button是Android Material Design设计语言中的一个重要组件,它的形状通常是...

    Android自定义可拖拽的悬浮按钮DragFloatingActionButton

    Android自定义可拖拽的悬浮按钮DragFloatingActionButton Android自定义可拖拽的悬浮按钮DragFloatingActionButton是Android 5.0系统添加的新控件,它继承至ImageView,因此拥有ImageView的所有属性。下面是对...

    Android 可拖动浮动工具条(菜单)Demo

    在Android开发中,创建一个可拖动的浮动工具条或菜单是一种常见的需求,它能提供用户友好的交互体验。这个“Android 可拖动浮动工具条(菜单)Demo”就是一个很好的示例,展示了如何实现这样的功能。下面我们将深入...

    Android 桌面漂浮按钮

    在Android开发中,桌面漂浮按钮(通常称为悬浮窗或Floating Action Button, FAB)是一种设计元素,用于提供主要操作或者快速访问功能。它通常是一个圆形的按钮,上面有一个图标,设计简洁,易于识别,旨在增强用户...

    ios-可移动浮动按钮.zip

    首先,浮动按钮的设计理念源自Material Design,它在Android系统中被广泛使用,但在iOS应用中也可以根据需求进行适配。这种按钮通常是一个圆形的图标,颜色鲜明,能够吸引用户的注意力。在iOS中,浮动按钮常常用来...

    android 可拖拽按钮 类似iOS assistive touch可全屏拖拽

    在Android开发中,实现一个类似iOS的Assistive Touch功能是一项常见的需求,它提供了一个浮动按钮,用户可以随时随地拖动并访问常用的功能。这个“android 可拖拽按钮 类似iOS assistive touch可全屏拖拽”的项目...

    Flutter任意拖动的悬浮按钮

    Flutter任意拖动的悬浮按钮,可以更改参数设定边界范围, 内包含多个Demo 仓库地址 https://github.com/ihongka/FlutterDIY

    安卓 仿AssistiveTouch 窗口浮动按钮

    在安卓平台上,"仿AssistiveTouch 窗口浮动按钮"是一种常见的用户界面功能,类似于苹果iOS系统中的AssistiveTouch。这个功能为用户提供了一个便捷的入口,通过一个小巧的浮动按钮,用户可以快速访问各种常用操作或者...

    Android悬浮拖动无视父类组件按钮

    在Android开发中,"Android悬浮拖动无视父类组件按钮"是一个相对高级且实用的技术,主要涉及到了Android的自定义视图、触摸事件处理以及布局管理等方面的知识。下面将详细阐述这一主题的相关知识点。 首先,Android...

    悬浮View,可拖动,放手后自动吸附到屏幕边上。

    在Android开发中,创建一个可拖动并能自动吸附到屏幕边缘的悬浮View是一项常见的需求,这通常用于实现类似桌面小部件或者浮动工具栏的功能。本文将深入探讨如何实现这样的功能,主要涉及Android Java编程语言以及...

    android 360浮动窗口

    在这个ViewGroup中,我们可以添加需要显示的各种View,如按钮、文本、图片等。自定义ViewGroup时,需要重写onMeasure()和onLayout()方法,以确定ViewGroup及其子View的大小和位置。 接着,我们需要一个悬浮服务...

    Android 绘制方式实现浮动视图

    在Android开发中,浮动视图(Floating View)通常指的是悬浮窗口或者浮动小部件,它们可以在应用程序的顶部或者屏幕的任意位置显示,不依赖于任何特定的Activity。这种功能常见于通知、聊天应用的小窗口或者自定义...

    FloatingActionButtonMenuDrag:带有菜单和可拖动控件的浮动操作按钮

    带有菜单和可拖动控件的浮动操作按钮 [ ]( ) 将其添加到存储库末尾的root build.gradle中: allprojects { repositories { ... maven { url 'https://jitpack.io' } } } 步骤2.添加依赖项 dependencies {...

    Android代码-自定义Floatview实现全站浮动按钮和来电秀

    自定义floatview,无需申明悬浮框权限,利用WindowManager TYPE_TOAST实现全站浮动式按钮,重写touch事件实现任意拖动,将view加入windowmanager层,可以使用控件实现类似来电秀的效果。 MIUI使用TYPE_TOAST也会无效...

    Xamarin.Android悬浮框

    悬浮框,也称为对话框或者浮动窗口,通常用于显示临时信息或者提供额外的功能选项,而不打断用户对主应用程序界面的操作。下面我们将深入探讨如何在Xamarin.Android中实现这样一个功能。 首先,悬浮框在Android中...

    android 拖动类似Iphone AssistiveTouch的快捷键按钮

    在Android平台上,实现类似iPhone的AssistiveTouch功能,可以为用户提供便捷的触控操作,类似于浮动菜单,方便用户快速访问常用功能。这个功能通常包括屏幕截图、返回、主页、多任务等操作,而且可以自定义设置。在...

    (android实现可拖拽的悬浮框)使用示例

    通过这个 `(android实现可拖拽的悬浮框)使用示例`,开发者可以了解到如何结合`WindowManager`、触摸事件监听以及自定义服务来创建一个可拖动的悬浮窗。这只是一个基础的实现,实际应用中可能需要考虑更多的细节,如...

Global site tag (gtag.js) - Google Analytics