Android拖动控件改变其位置

简介: mainActivity如下: package cn.dragtest; import android.app.Activity; import android.

mainActivity如下:

package cn.dragtest;
import android.app.Activity;
import android.graphics.Rect;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.Button;
import android.widget.ImageView;
public class MainActivity extends Activity implements OnTouchListener{
   private Button mButton;
   private ImageView mImageView;
   private DisplayMetrics displayMetrics;
   private float lastX=0;
   private float lastY=0;
   private int screenWidth=0;
   private int screenHeight=0;
   private int left;
   private int top;
   private int right;
   private int bottom;
   private boolean isFirst=true;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        initView();
    }
	private void initView() {
         mButton=(Button) findViewById(R.id.button);	
         mImageView=(ImageView) findViewById(R.id.imageView);
         mButton.setOnTouchListener(this);
         mImageView.setOnTouchListener(this);
	}
	public boolean onTouch(View view, MotionEvent event) {
		if (isFirst) {
			// 得到屏幕的宽
			displayMetrics = getResources().getDisplayMetrics();
			screenWidth = displayMetrics.widthPixels;
			// 得到标题栏和状态栏的高度
			Rect rect = new Rect();
			Window window = getWindow();
			mImageView.getWindowVisibleDisplayFrame(rect);
			int statusBarHeight = rect.top;
			int contentViewTop = window.findViewById(Window.ID_ANDROID_CONTENT).getTop();
			int titleBarHeight = contentViewTop - statusBarHeight;
			// 得到屏幕的高
			screenHeight = displayMetrics.heightPixels- (statusBarHeight + titleBarHeight);
			isFirst=false;
		}
		int action=event.getAction();
		switch (action) {
		//按下
		case MotionEvent.ACTION_DOWN:
			//按下处坐标
			lastX=event.getRawX();
			lastY=event.getRawY();
			break;
		//移动
		case MotionEvent.ACTION_MOVE:
			//移动的距离
			float distanceX=event.getRawX()-lastX;
			float distanceY=event.getRawY()-lastY;
			//移动后控件的坐标
			left=(int)(view.getLeft()+distanceX);
			top=(int)(view.getTop()+distanceY);
			right=(int)(view.getRight()+distanceX);
			bottom=(int)(view.getBottom()+distanceY);
			//处理拖出屏幕的情况
			if (left<0) {
				left=0;
				right=view.getWidth();
			}
			if (right>screenWidth) {
				right=screenWidth;
				left=screenWidth-view.getWidth();
			}
			if (top<0) {
				top=0;
				bottom=view.getHeight();
			}
			if (bottom>screenHeight) {
				bottom=screenHeight;
				top=screenHeight-view.getHeight();
			}
			//显示图片
			view.layout(left, top, right, bottom);
			lastX=event.getRawX();
			lastY=event.getRawY();
			break;
		//抬起
		case MotionEvent.ACTION_UP:
			break;
		default:
			break;
		}
		return false;
	}
}


main.xml如下:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center_horizontal"
     >

    <ImageView
        android:id="@+id/imageView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher"
        android:clickable="true"
     />
    <Button 
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="please drag"
        android:clickable="true"
    />
</LinearLayout>


 

相关文章
|
10月前
|
XML Java API
20. 【Android教程】拖动条 SeekBar
20. 【Android教程】拖动条 SeekBar
151 3
|
7月前
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
95 3
|
6月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
73 0
|
8月前
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
10月前
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
165 3
|
10月前
|
Java Android开发
18. 【Android教程】图片控件 ImageView
18. 【Android教程】图片控件 ImageView
166 4
|
10月前
|
XML 前端开发 API
Android中实现Bitmap在自定义View中的放大与拖动
Android中实现Bitmap在自定义View中的放大与拖动
184 1
|
10月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
352 2
|
10月前
|
Java Android开发 开发者
17. 【Android教程】开关控件ToggleButton/Switch
17. 【Android教程】开关控件ToggleButton/Switch
146 2
|
9月前
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
79 0

热门文章

最新文章