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>


 

相关文章
|
5月前
|
XML 搜索推荐 Android开发
Android改变进度条控件progressbar的样式(根据源码修改)
本文介绍了如何基于Android源码自定义ProgressBar样式。首先分析了系统源码中ProgressBar样式的定义,发现其依赖一张旋转图片实现动画效果。接着分两步指导开发者实现自定义:1) 模仿源码创建一个旋转动画XML文件(放置在drawable文件夹),修改图片为自定义样式;2) 在UI控件中通过`indeterminateDrawable`属性应用该动画。最终实现简单且个性化的ProgressBar效果,附带效果图展示。
278 2
|
5月前
|
Android开发
Android控件样式的抽取(小提及快捷方式)
在Android开发中,若多个控件样式重复,可抽取公共部分以简化代码。例如对EditText提取样式,通过编辑`styles.xml`实现复用。为提高效率,Android Studio提供自动提取Style功能:右键点击控件样式选项,选择“Style...”,勾选需要提取的属性后确认,即可快速生成样式代码,显著提升开发便利性。
146 2
|
XML 编解码 Android开发
安卓开发中的自定义视图控件
【9月更文挑战第14天】在安卓开发中,自定义视图控件是一种高级技巧,它可以让开发者根据项目需求创建出独特的用户界面元素。本文将通过一个简单示例,引导你了解如何在安卓项目中实现自定义视图控件,包括创建自定义控件类、处理绘制逻辑以及响应用户交互。无论你是初学者还是有经验的开发者,这篇文章都会为你提供有价值的见解和技巧。
156 3
|
12月前
|
XML 存储 Java
浅谈Android的TextView控件
浅谈Android的TextView控件
109 0
|
前端开发 Android开发 开发者
安卓开发中的自定义视图:构建你的第一个控件
【8月更文挑战第26天】在安卓开发的浩瀚海洋中,自定义视图是一块充满魔力的乐土。它不仅是开发者展示创造力的舞台,更是实现独特用户体验的关键。本文将带你步入自定义视图的世界,从基础概念到实战应用,一步步教你如何打造自己的第一个控件。无论你是初学者还是有经验的开发者,这篇文章都将为你的开发之旅增添新的风景。
|
Android开发
Android中如何快速的实现RecycleView的拖动重排序功能
使用`ItemTouchHelper`和自定义`Callback`,在`RecyclerView`中实现拖动排序功能。定义`ItemTouchHelperAdapter`接口,`Adapter`实现它以处理`onItemMove`方法。`SimpleItemTouchHelperCallback`设置拖动标志,如`LEFT`或`RIGHT`(水平拖动),并绑定到`RecyclerView`以启用拖动。完成这些步骤后,即可实现拖放排序。关注公众号“AntDream”获取更多内容。
282 3
|
XML 前端开发 API
Android中实现Bitmap在自定义View中的放大与拖动
Android中实现Bitmap在自定义View中的放大与拖动
233 1
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
576 2
|
XML 数据格式
Android-自定义三角形评分控件
Android-自定义三角形评分控件
146 0
|
XML Android开发 数据格式
Android基础控件介绍
Android基础控件介绍
131 0

热门文章

最新文章

  • 1
    Android实战经验之Kotlin中快速实现MVI架构
    344
  • 2
    即时通讯安全篇(一):正确地理解和使用Android端加密算法
    212
  • 3
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
    555
  • 4
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    854
  • 5
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
    314
  • 6
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    232
  • 7
    Android历史版本与APK文件结构
    739
  • 8
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
    246
  • 9
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
    263
  • 10
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
    491