Android——控件跟随手指移动

2024-03-20 21:58

本文主要是介绍Android——控件跟随手指移动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android开发中遇到过的坑——控件跟随手指移动

思路

实现任意控件跟随手指触摸移动。核心思路监听onTouch事件,在ACTION_MOVE中改变控件的坐标。思路虽然简单,但其中还有一些坑。
本文的思路借鉴了http://blog.csdn.net/actual_/article/details/8582313这位博主的代码,但他的代码有个Bug,即当拖动控件到屏幕中间位置时控件会变形,分析其代码,主要问题出现在:

case MotionEvent.ACTION_MOVE:  RelativeLayout.LayoutParams layoutParams =    (RelativeLayout.LayoutParams) view  .getLayoutParams();  layoutParams.leftMargin = X - _xDelta;  layoutParams.topMargin = Y - _yDelta;  layoutParams.rightMargin = -250;  layoutParams.bottomMargin = -250;  view.setLayoutParams(layoutParams);  break;  

其中设置了控件上、下、左、右元素间隔的距离,从而完成在RelativeLayout布局中对于控件位置的设置,但是当左右间隔或上下间隔之和不对的时候,则会挤压控件的长宽。

这里换一个思路,其实只设置控件距上、左元素的距离即可完成RelativeLayout布局中控件位置的设置,并设置控件的长宽,保持其形状大小不变。

case MotionEvent.ACTION_MOVE:  int dx = (int) event.getRawX() - lastX;int dy = (int) event.getRawY() - lastY;int left = view.getLeft() + dx;int top = view.getTop() + dy;RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view .getLayoutParams();  layoutParams.height=IMAGE_SIZE;layoutParams.width = IMAGE_SIZE;layoutParams.leftMargin =left;  layoutParams.topMargin =top;  view.setLayoutParams(layoutParams);lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;  

主要代码

MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;public class MainActivity extends AppCompatActivity implements OnTouchListener {ImageView _view,_view2;  ViewGroup _root;  private int lastX, lastY;final static int IMAGE_SIZE = 72; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);_root = (ViewGroup) findViewById(R.id.root);  _view = (ImageView) findViewById(R.id.id_text);  _view2 = (ImageView) findViewById(R.id.id_text2); RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(  IMAGE_SIZE, IMAGE_SIZE);  layoutParams.leftMargin = IMAGE_SIZE;  layoutParams.topMargin = IMAGE_SIZE;  _view.setLayoutParams(layoutParams);  _view.setOnTouchListener(this); RelativeLayout.LayoutParams layoutParams2 = new RelativeLayout.LayoutParams(  IMAGE_SIZE, IMAGE_SIZE);  layoutParams2.leftMargin = 3*IMAGE_SIZE;  layoutParams2.topMargin = IMAGE_SIZE;  _view2.setLayoutParams(layoutParams2);  _view2.setOnTouchListener(this);  }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.main, menu);return true;}@Overridepublic boolean onOptionsItemSelected(MenuItem item) {// Handle action bar item clicks here. The action bar will// automatically handle clicks on the Home/Up button, so long// as you specify a parent activity in AndroidManifest.xml.int id = item.getItemId();if (id == R.id.action_settings) {return true;}return super.onOptionsItemSelected(item);}public boolean onTouch(View view, MotionEvent event) {  final int X = (int) event.getRawX();  final int Y = (int) event.getRawY();  switch (event.getAction() & MotionEvent.ACTION_MASK) {  case MotionEvent.ACTION_DOWN:  lastX = (int) event.getRawX();lastY = (int) event.getRawY();RelativeLayout.LayoutParams lParams = (RelativeLayout.LayoutParams) view  .getLayoutParams();   break;  case MotionEvent.ACTION_UP:  break;  case MotionEvent.ACTION_POINTER_DOWN:  break;  case MotionEvent.ACTION_POINTER_UP:  break;  case MotionEvent.ACTION_MOVE:  int dx = (int) event.getRawX() - lastX;int dy = (int) event.getRawY() - lastY;int left = view.getLeft() + dx;int top = view.getTop() + dy;RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) view .getLayoutParams();  layoutParams.height=IMAGE_SIZE;layoutParams.width = IMAGE_SIZE;layoutParams.leftMargin =left;  layoutParams.topMargin =top;  view.setLayoutParams(layoutParams);lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;  }  _root.invalidate();  return true;  }  
}

activity_main.xml

这里写代码片<RelativeLayout 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:id="@+id/root"  tools:context=".MainActivity" >  <ImageView  android:id="@+id/id_text"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_centerHorizontal="true"  android:layout_centerVertical="true"  android:background="@drawable/pin2"/>  <ImageView  android:id="@+id/id_text2"  android:layout_width="wrap_content"  android:layout_height="wrap_content"  android:layout_centerHorizontal="true"  android:layout_centerVertical="true"  android:background="@drawable/pin2"/> 
</RelativeLayout>  

这篇关于Android——控件跟随手指移动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/830854

相关文章

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Android与iOS设备MAC地址生成原理及Java实现详解

《Android与iOS设备MAC地址生成原理及Java实现详解》在无线网络通信中,MAC(MediaAccessControl)地址是设备的唯一网络标识符,本文主要介绍了Android与iOS设备M... 目录引言1. MAC地址基础1.1 MAC地址的组成1.2 MAC地址的分类2. android与I

双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程

《双系统电脑中把Ubuntu装进外接移动固态硬盘的全过程》:本文主要介绍如何在Windows11系统中使用VMware17创建虚拟机,并在虚拟机中安装Ubuntu22.04桌面版或Ubunt... 目录一、首先win11中安装vmware17二、磁盘分区三、保存四、使用虚拟机进行系统安装五、遇见的错误和解决

使用FileChannel实现文件的复制和移动方式

《使用FileChannel实现文件的复制和移动方式》:本文主要介绍使用FileChannel实现文件的复制和移动方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录使用 FileChannel 实现文件复制代码解释使用 FileChannel 实现文件移动代码解释

Android 实现一个隐私弹窗功能

《Android实现一个隐私弹窗功能》:本文主要介绍Android实现一个隐私弹窗功能,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 效果图如下:1. 设置同意、退出、点击用户协议、点击隐私协议的函数参数2. 《用户协议》、《隐私政策》设置成可点击的,且颜色要区分出来res/l

Android实现一键录屏功能(附源码)

《Android实现一键录屏功能(附源码)》在Android5.0及以上版本,系统提供了MediaProjectionAPI,允许应用在用户授权下录制屏幕内容并输出到视频文件,所以本文将基于此实现一个... 目录一、项目介绍二、相关技术与原理三、系统权限与用户授权四、项目架构与流程五、环境配置与依赖六、完整

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮