基于Android图标拖动布局的实现
给安卓菜单应用程序组中整理、移动程序图标
Step by Step: 在安卓菜单主应用程序组中移动程序图标通常情况下,安卓手机的用户都会排布桌面,将不同的桌面页用于不同的分类应用,如多媒体页、市场和系统工具页、电子书和阅读页等等,然后添加或删除对应的组件/插件和App应用程序图标。
整洁的桌面背后,App应用程序组里则是杂乱无章。
我没有洁癖,我都受不了!随着不断地安装新的和移除老的应用,两个问题会越来越麻烦:一个是不同时期安装的同类应用散落在不同的分页中,找起来很不方便;另一个是新的页面不断增加而之前的页面当旧的应用删除了之后空余的地方又不能重新利用。
以三星I9100(SAMSUNG Galaxy S II I9100)为例,Step by Step教你会做三件事:a)在安卓主应用程序组中的分页内或分页间移动程序图标b)在安卓主应用程序组中使用分类子文件夹c)在桌面分页间移动程序图标1,在桌面,按应用程序图标,进入安卓主应用程序组界面;然后按手机的左键菜单键,底部出现三格菜单,如图1所示。
2,按“编辑”图标,进入图2所示界面,分页页面缩小,可左右翻页。
图1 图23,切换页面,找到要移动的图标,长按该图标,图标突出浮动,随指尖移动,如图3中的“多米音乐”。
将手机略左右侧翻,程序组分页相应左右滑动,直至到某页面将该图标放下。
4,页面内也可以使用这个方法将一个图标上下左右移动到合适的位置。
5,也可以在某页创建一个子文件夹,用于分组一类应用程序图标。
操作是按住图3中所示的“添加文件夹”菜单按钮,拖动至页面空白位置。
系统提示输入文件夹名称,“导航”,“Google Map”等,如图4所示。
图3 图46,创建好的程序文件夹如图5所示。
可以长按一个图标拖动放入该文件夹图标上,表示要放进此文件夹。
譬如“Google Map”文件夹内包含了Google地图、本地搜索、导航、谷歌纵横四个图标。
7,要删除一个不用的文件夹,可以短按这个文件夹图标,如“导航”,系统将提示移除该文件夹。
Android用户界面---拖放(DragandDrop)(一)
Android⽤户界⾯---拖放(DragandDrop)(⼀)⽤Android的拖放框架,能够允许⽤户使⽤图形化的拖放⼿势,把数据从当前布局中的⼀个View对象中移到另⼀个View对象中。
这个框架包括:拖拽事件类、拖拽监听器、以及辅助的⽅法和类。
尽管这个框架主要是为数据移动设计的,但是你能够把它⽤于其他的UI操作。
如,你能够创建⼀个调⾊应⽤程序,⽤户把⼀个颜⾊的图标拖到另⼀个颜⾊图标之上,完成两个颜⾊的调配操作。
概要当⽤户使⽤⼀些被认可的⼿势信号来开始拖动数据时,⼀个拖放操作就开始了。
在响应中,应⽤程序会告诉系统拖动正在启动。
系统就会回调应⽤程序来获得⼀个代表被拖动的数据的图形,当⽤户的⼿指移到这个代表图形(拖动阴影)当前的布局之上时,系统会把拖动事件发给拖动事件监听器对象,并且拖动事件回调⽅法会跟布局中对应View对象进⾏关联。
⼀旦⽤户释放了拖动阴影图形,系统就会结束拖动操作。
从实现View.OnDragListener接⼝的类中创建⼀个拖动事件监听器对象。
⽤View对象的setOnDragListener()⽅法把拖动事件监听器对象设置给⼀个View对象。
每个View对象还有⼀个onDragEvent()回调⽅法。
这两个⽅法会在“拖拽事件监听器和回调⽅法”⼀节中详细介绍。
注意:为了简单起见,⼀下章节⽤“拖拽事件监听器”作为接收拖拽事件的⽰例程序,尽管可实践中也可以使⽤回调⽅法。
在开始拖动的时候,要把要移动的数据和描述这个数据的元数据作为系统调⽤的⼀部分。
拖拽期间,系统把拖拽事件发送给拖拽事件监听器或布局中每个View对象的回调⽅法。
监听器或回调⽅法能够使⽤元数据来判断它们是否能够接受这种数据。
如果⽤户在⼀个View对象之上放下数据,并且这个View对象的监听器或回调⽅法已经告诉系统它要接收这个数据,那么系统就会把数据发送给拖拽事件中的监听器或回调⽅法。
通过调⽤startDrag()⽅法,应⽤程序会告诉系统开始拖拽的动作。
android实现拖动效果
android实现拖动效果要实现拖动效果需要做以下的准备。
1.创建一个android工程。
2.在main.xml中添加一个ViewFlipper组件。
<ViewFlipper android:id="@+id/ViewFlipper01"android:layout_width="wrap_content" android:layout_height="wrap_content"></ViewFlipper>在代码中设置ViewFlipper的事件和属性viewFlipper = (ViewFlipper) findViewById(R.id.ViewFlipper01);//得到对象viewFlipper.setLongClickable(true);//如果不设置为true,对象就不会响应onTouch事件viewFlipper.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {//gd是一个GestureDetector对象。
具体的会在下面讲到。
GestureDetector会根据转入的MotionEvent事件来判断用户进行了哪种操作。
ActivityMain.this.gd.onTouchEvent(event);return false;}});3.添加一个GestureDetector对象。
并实现GestureDetector.OnGestureListener接口。
GestureDetector对象对接收多个MotionEvent事件。
并根据这些MotionEvent事件来判断用户在进行什么操作。
@Overridepublic boolean onSingleTapUp(MotionEvent e) {//用户轻触屏幕后松开。
android实现上下左右滑动界面布局
android实现上下左右滑动界⾯布局本⽂实例为⼤家分享了android实现滑动界⾯布局的具体代码,供⼤家参考,具体内容如下1.我使⽤的是ScrollView嵌套HorizontalScrollView让ScrollView负责上下滑动HorizontalScrollView负责左右滑动2.以下代码提供了思路和完成⼿段,请根据具体业务去进⾏修改,我试过使⽤recyclerview进⾏⾃定义,发现⼀旦有了复杂业务之后会掉帧卡顿所以使⽤了这种⽅法XML布局<?xml version="1.0" encoding="utf-8"?><.myapplication.PagerScrollViewxmlns:android="/apk/res/android"xmlns:app="/apk/res-auto"android:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><HorizontalScrollViewandroid:id="@+id/hor"android:layout_width="match_parent"android:background="#e1f1f1"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center|left"android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor1"android:layout_width="match_parent" android:scrollbars="none"android:background="#a2f2f2"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor2"android:layout_width="match_parent" android:scrollbars="none"android:background="#a2a2f2"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor3"android:layout_width="match_parent" android:scrollbars="none"android:background="#f3f3f3"android:layout_height="160dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor4"android:layout_width="match_parent" android:scrollbars="none"android:background="#a4f4f4"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor5"android:layout_width="match_parent" android:scrollbars="none"android:background="#f5f5f5"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView><HorizontalScrollViewandroid:id="@+id/hor6"android:layout_width="match_parent" android:scrollbars="none"android:background="#a5f5f5"android:layout_height="200dp"><LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center|left" android:gravity="center"android:orientation="horizontal"><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A1"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A2"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A3"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A4"/> <TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A5"/><TextViewandroid:layout_width="160dp"android:layout_height="60dp"android:gravity="center"android:text="A6"/></LinearLayout></HorizontalScrollView></LinearLayout></.myapplication.PagerScrollView> mainAvtivity的代码package .myapplication;import android.annotation.SuppressLint;import android.content.Context;import android.support.v7.app.AppCompatActivity; import android.os.Bundle;import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet;import android.util.Log;import youtInflater;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import android.widget.ScrollView;import android.widget.TextView;import android.widget.Toast;import org.w3c.dom.Text;import ng.reflect.Array;import java.util.ArrayList;import java.util.List;/*** zhaohan creat 2019/3/6*/public class MainActivity extends AppCompatActivity { String TAG = "主程序";float mPosX;float mPosY;float mCurPosX;float mCurPosY;int offset=10;//偏移量int friction = 10;//摩擦⼒final List<HorizontalScrollView> list = new ArrayList();@SuppressLint("ClickableViewAccessibility")@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);final PagerScrollView scrollView = findViewById(R.id.main);list.add((HorizontalScrollView) findViewById(R.id.hor));list.add((HorizontalScrollView) findViewById(R.id.hor1));list.add((HorizontalScrollView) findViewById(R.id.hor2));list.add((HorizontalScrollView) findViewById(R.id.hor3));list.add((HorizontalScrollView) findViewById(R.id.hor4));list.add((HorizontalScrollView) findViewById(R.id.hor5));list.add((HorizontalScrollView) findViewById(R.id.hor6));for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mPosX = event.getX();mPosY = event.getY();Log.w(TAG,mPosY+"");break;case MotionEvent.ACTION_MOVE:mCurPosX = event.getX();mCurPosY = event.getY();case MotionEvent.ACTION_UP:if (mCurPosX - mPosX > 0 && (Math.abs(mCurPosX - mPosX) > offset)) {int speed = 10;//速度int distance = 20;//滑动距离if((Math.abs(mCurPosX - mPosX))>50){speed = (int) Math.abs(mCurPosX - mPosX)/friction;distance = (int) Math.abs(mCurPosX - mPosX)/3;//滑动距离}//向右滑動Log.w(TAG,"向右滑动了!");while(distance>0) {distance = distance - speed;for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.smoothScrollBy(distance, 0);}}return true;//true为屏蔽范围内的其他滑动监听} else if (mCurPosX - mPosX < 0 && (Math.abs(mCurPosX - mPosX) > offset)) { int speed = 10;//速度int distance = 20;//滑动距离if((Math.abs(mCurPosX - mPosX))>50){speed = (int) Math.abs(mCurPosX - mPosX)/friction;distance = (int) Math.abs(mCurPosX - mPosX)/3;//滑动距离}//向左滑动Log.w(TAG,"向左滑动了!");//改为滑动while(distance>0){distance=distance-speed;for(HorizontalScrollView horizontalScrollView:list){horizontalScrollView.smoothScrollBy(-distance,0 );}}return true;//true为屏蔽范围内的其他滑动监听}break;}return true;//true为屏蔽范围内的其他滑动监听}});}}}class PagerScrollView extends ScrollView {private float xDistance, yDistance, xLast, yLast;public PagerScrollView(Context context) {super(context);}public PagerScrollView(Context context, AttributeSet attrs) {super(context, attrs);}public PagerScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_DOWN:xDistance = yDistance = 0f;xLast = ev.getX();yLast = ev.getY();break;case MotionEvent.ACTION_MOVE:final float curX = ev.getX();final float curY = ev.getY();xDistance += Math.abs(curX - xLast);yDistance += Math.abs(curY - yLast);xLast = curX;yLast = curY;/*** X轴滑动距离⼤于Y轴滑动距离,也就是⽤户横向滑动时,返回false,ScrollView不处理这次事件, * 让⼦控件中的TouchEvent去处理,所以横向滑动的事件交由ViewPager处理,* ScrollView只处理纵向滑动事件*/if (xDistance > yDistance) {return false;}}return super.onInterceptTouchEvent(ev);}}以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
Android手机界面管理系统的设计与实现
Android手机界面管理系统的设计与实现随着智能手机的普及和进步,人们对于手机界面的要求也越来越高。
作为安卓系统的使用者,用户期望能够便利、高效地管理自己的手机界面,以提高使用体验。
因此,设计和实现一个Android手机界面管理系统是分外必要和有意义的。
在设计和实现Android手机界面管理系统之前,起首我们需要了解Android操作系统的架构。
Android操作系统接受了混合式架构,包括Linux内核、库和Android运行时环境。
其中,应用程序框架层是毗连应用和底层硬件的关键层级。
通过对框架层的改进,我们可以实现手机界面的管理与个性化设置。
Android手机界面管理系统的设计思路如下:1. 主题设置:提供多种主题供用户选择,并能够定制主题。
用户可以依据自己的喜好选择不同的主题,以改变手机界面的外观和样式。
同时,用户还可以依据自己的需求自定义主题,如更改壁纸、图标、字体颜色等。
2. 图标管理:提供图标的管理和设置功能,用户可以增加、删除、排序和分组图标。
通过图标管理功能,用户可以将应用程序图标进行自由组合和分类,以便利快捷地访问和使用不同的应用程序。
3. 桌面布局:允许用户自定义桌面的布局和排列方式,包括图标的大小、间距、格式等。
用户可以依据实际需求调整桌面布局,以达到更加高效和便捷的操作体验。
4. 手势操作:支持多种手势操作,如单击、双击、滑动、捏合等。
用户可以通过手势操作实现快速切换应用、调整音量等功能,提高手机界面的操作效率。
5. 待机界面:提供个性化的待机界面设置,包括时钟样式、天气信息、待机壁纸等。
用户可以依据自己的喜好进行设置,使手机待机界面更加丰富和有趣。
在实现Android手机界面管理系统时,可以使用Java编程语言和Android开发工具来实现。
通过使用Android开发工具提供的界面布局、事件处理等功能,可以便利地实现界面管理系统的各项功能。
最后,在实现Android手机界面管理系统后,还需要进行测试和优化。
一种控制安卓桌面图标拖动的方法[发明专利]
专利名称:一种控制安卓桌面图标拖动的方法专利类型:发明专利
发明人:胡瑞,段军,朱寅娟
申请号:CN201710912159.4
申请日:20170929
公开号:CN107577392A
公开日:
20180112
专利内容由知识产权出版社提供
摘要:本发明记载了一种控制安卓桌面图标拖动的方法,采用判断拖动状态、允许拖动以及不允许拖动状态等主要判断步骤,可以在用户拖动图标时进行判断和控制,从而显著减少因老人、儿童等对Android Launcher使用方法不明确的人群在使用Android Launcher时常把Launcher桌面应用误移动、误删除等问题的发生频率。
申请人:南京中兴技术软件有限公司
地址:210012 江苏省南京市雨花台区花神大道27号-1
国籍:CN
代理机构:上海衡方知识产权代理有限公司
代理人:卞孜真
更多信息请下载全文后查看。
Android实现可拖动层叠卡片布局
Android实现可拖动层叠卡⽚布局公司app要求做⼀个扭蛋功能,其实就是⼀个可拖动层叠卡⽚列表,原理还是由⼀个⾃定义Recyclerview和LayoutManager来实现⾃定义RecyclerView很简单,只是修改touch事件,防⽌点击到卡⽚外还被处理的情况@Overridepublic boolean onTouchEvent(MotionEvent e) {if(e.getY()< UIUtil.dip2px(TutuApplication.getInstance().getContext(),95)||e.getY()>getHeight()-UIUtil.dip2px(TutuApplication.getInstance().getContext(),95)){ if(e.getAction()!=MotionEvent.ACTION_UP && e.getAction()!=MotionEvent.ACTION_MOVE) {return false;}}return super.onTouchEvent(e);}实际的层叠效果还是需要LayoutManager来实现public class SwipeCardLayoutManager extends youtManager {Context context;int TRANS_Y_GAP;public SwipeCardLayoutManager(Context context){TRANS_Y_GAP= (int) TypedValue.applyDimension(PLEX_UNIT_DIP,15,context.getResources().getDisplayMetrics());}@Overridepublic youtParams generateDefaultLayoutParams() {return new youtParams(youtParams.WRAP_CONTENT,youtParams.WRAP_CONTENT);}@Overridepublic void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {super.onLayoutChildren(recycler, state);//1.如何实现层叠效果yout(l,t,r,b)//2.如何让8个条⽬中的4个展⽰在RecylerView⾥⾯//1在布局layout之前,将所有的⼦View先全部detach掉,然后放到Scrap集合⾥⾯缓存。
Android简单实现控件的拖动
Android简单实现控件的拖动控件的拖动,使⽤到⼀个监听事件setOnTouchListener:XML代码:1<?xml version="1.0" encoding="utf-8"?>2<LinearLayout3xmlns:android="/apk/res/android"4 xmlns:app="/apk/res-auto"5 xmlns:tools="/tools"6 android:layout_width="match_parent"7 android:layout_height="match_parent"8 tools:context=".MainActivity">910<ImageView11android:id="@+id/textview"12 android:src="@drawable/ic_launcher_foreground"13 android:layout_width="wrap_content"14 android:layout_height="wrap_content"15 android:background="@color/colorPrimaryDark"16 android:text=""/>1718</LinearLayout>JAVA代码1package com.example.a11658.textviewdrag;23import android.annotation.SuppressLint;4import android.os.Bundle;5import android.support.v7.app.AppCompatActivity;6import android.view.MotionEvent;7import android.view.View;8import android.widget.ImageView;910public class MainActivity extends AppCompatActivity {11private ImageView tv;12private int x;13private int y;1415 @SuppressLint("ClickableViewAccessibility")16 @Override17protected void onCreate(Bundle savedInstanceState) {18super.onCreate(savedInstanceState);19 setContentView(yout.activity_main);2021 tv = findViewById(R.id.textview);22 tv.setOnTouchListener(new View.OnTouchListener() {23 @Override24public boolean onTouch(View v, MotionEvent event) {25switch (event.getAction()) {26case MotionEvent.ACTION_DOWN:27//⼿指按下28//获取第⼀次接触屏幕29 x = (int) event.getRawX();30 y = (int) event.getRawY();31break;32case MotionEvent.ACTION_MOVE:33//⼿指拖动34//获取距离差35int dx = (int) event.getRawX() - x;36int dy = (int) event.getRawY() - y;37//更改Imageview在窗体的位置38 yout(v.getLeft() + dx, v.getTop() + dy,39 v.getRight() + dx, v.getBottom() + dy);40//获取移动后的位置41 x = (int) event.getRawX();42 y = (int) event.getRawY();43break;44case MotionEvent.ACTION_UP:45//⼿指弹起46 x = (int) event.getRawX();47 y = (int) event.getRawY();48break;49 }50return true;51 }52 });53 }54 }yout(left, top, right, bottom)实现拖动。
android-可拖拽的gridview
Android学习系列(12)--App列表之拖拽GridView根据前面文章中ListView拖拽的实现原理,我们也是很容易实现推拽GridView的,下面我就以相同步骤实现基本的GridView拖拽效果。
因为GridView不用做分组处理,代码处理起来更简洁,而且原理前面已经讲解清楚了,代码中只是简单的过下,必要的地方简单的注释一下。
1.主界面DragGridActivity.public class DragGridActivity extends Activity {private static List<String> list = null;//自定义适配器private DragGridAdapter adapter = null;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.drag_grid_activity);initData();//后面用到的自定义GridViewDragGridView dragGridView = (DragGridView)findViewById(R.id.drag_grid);adapter = new DragGridAdapter(this, list);dragGridView.setAdapter(adapter);}public void initData(){//数据结果list = new ArrayList<String>();for(int i=0; i<12; i++){list.add("grid_"+i%12);}}}2.主界面UI布局drag_grid_activity.xml.<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android"android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="#ffffff"android:padding="10dip"><com.fengjian.test.DragGridViewandroid:id="@+id/drag_grid"android:layout_width="fill_parent"android:layout_height="wrap_content"android:cacheColorHint="#00000000"android:numColumns="3"android:stretchMode="columnWidth"android:verticalSpacing="5dip"android:horizontalSpacing="20dip"android:background="#ffffff"/></LinearLayout>3.列表项布局drag_grid_item.xml.<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="/apk/res/android"android:layout_width="fill_parent"android:layout_height="wrap_content"android:paddingLeft="5dip"android:paddingRight="5dip"><ImageView android:id="@+id/drag_grid_item_image"android:src="@drawable/grid_icon"android:layout_margin="5dip"android:layout_alignParentTop="true"android:layout_width="fill_parent"android:layout_height="wrap_content"/><ImageView android:id="@+id/drag_grid_item_drag"android:src="@drawable/grid_drag"android:layout_alignParentTop="true"android:layout_alignParentRight="true"android:layout_width="wrap_content"android:layout_height="wrap_content"/></RelativeLayout>4.自定义适配器DragGridAdapter,继承ArrayAdapter<String>.public static class DragGridAdapter extends ArrayAdapter<String>{public DragGridAdapter(Context context, List<String> objects) {super(context, 0, objects);}public List<String> getList(){return list;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {View view = convertView;if(view==null){view = LayoutInflater.from(getContext()).inflate(yout.drag_grid_item, null);}try {//根据文件名获取资源文件夹中的图片资源Field f= (Field)R.drawable.class.getDeclaredField(getItem(position));int i=f.getInt(R.drawable.class);ImageView imageview= (ImageView)view.findViewById(R.id.drag_grid_item_image);imageview.setImageResource(i);} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchFieldException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}return view;}}5.自定义视图类DragGridView,继承GridView.public class DragGridView extends GridView {//定义基本的成员变量private ImageView dragImageView;private int dragSrcPosition;private int dragPosition;//x,y坐标的计算private int dragPointX;private int dragPointY;private int dragOffsetX;private int dragOffsetY;private WindowManager windowManager;private youtParams windowParams;private int scaledTouchSlop;private int upScrollBounce;private int downScrollBounce;public DragGridView(Context context, AttributeSet attrs) { super(context, attrs);}}6. 重写触控拦截事件方法onInterceptTouchEvent().@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if(ev.getAction()==MotionEvent.ACTION_DOWN){int x = (int)ev.getX();int y = (int)ev.getY();dragSrcPosition = dragPosition = pointToPosition(x, y);if(dragPosition==AdapterView.INVALID_POSITION){return super.onInterceptTouchEvent(ev);}ViewGroup itemView = (ViewGroup) getChildAt(dragPosition-getFirstVisiblePosition());dragPointX = x - itemView.getLeft();dragPointY = y - itemView.getTop();dragOffsetX = (int) (ev.getRawX() - x);dragOffsetY = (int) (ev.getRawY() - y);View dragger = itemView.findViewById(R.id.drag_grid_item_drag); //如果选中拖动图标if(dragger!=null&&dragPointX>dragger.getLeft()&&dragPointX<dragger.getRight ()&&dragPointY>dragger.getTop()&&dragPointY<dragger.getBottom()+20){upScrollBounce = Math.min(y-scaledTouchSlop, getHeight()/4); downScrollBounce = Math.max(y+scaledTouchSlop, getHeight()*3/4);itemView.setDrawingCacheEnabled(true);Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache());startDrag(bm, x, y);}return false;}return super.onInterceptTouchEvent(ev);}startDrag和stopDrag方法如下:public void startDrag(Bitmap bm, int x, int y){stopDrag();windowParams = new youtParams();windowParams.gravity = Gravity.TOP|Gravity.LEFT;windowParams.x = x - dragPointX + dragOffsetX;windowParams.y = y - dragPointY + dragOffsetY;windowParams.width = youtParams.WRAP_CONTENT;windowParams.height = youtParams.WRAP_CONTENT;windowParams.flags = youtParams.FLAG_NOT_FOCUSABLE | youtParams.FLAG_NOT_TOUCHABLE | youtParams.FLAG_KEEP_SCREEN_ON |youtParams.FLAG_LAYOUT_IN_SCREEN;windowParams.format = PixelFormat.TRANSLUCENT;windowParams.windowAnimations = 0;ImageView imageView = new ImageView(getContext());imageView.setImageBitmap(bm);windowManager = (WindowManager)getContext().getSystemService("window");windowManager.addView(imageView, windowParams);dragImageView = imageView;}public void onDrag(int x, int y){if(dragImageView!=null){windowParams.alpha = 0.8f;windowParams.x = x - dragPointX + dragOffsetX;windowParams.y = y - dragPointY + dragOffsetY;windowManager.updateViewLayout(dragImageView, windowParams);}int tempPosition = pointToPosition(x, y);if(tempPosition!=INVALID_POSITION){dragPosition = tempPosition;}//滚动if(y<upScrollBounce||y>downScrollBounce){//使用setSelection来实现滚动setSelection(dragPosition);}}7.重写onTouchEvent()方法.@Overridepublic boolean onTouchEvent(MotionEvent ev) {if(dragImageView!=null&&dragPosition!=INVALID_POSITION){ int action = ev.getAction();switch(action){case MotionEvent.ACTION_UP:int upX = (int)ev.getX();int upY = (int)ev.getY();stopDrag();onDrop(upX,upY);break;case MotionEvent.ACTION_MOVE:int moveX = (int)ev.getX();int moveY = (int)ev.getY();onDrag(moveX,moveY);break;default:break;}return true;}return super.onTouchEvent(ev);}其中onDrag方法如下:public void onDrag(int x, int y){if(dragImageView!=null){windowParams.alpha = 0.8f;windowParams.x = x - dragPointX + dragOffsetX;windowParams.y = y - dragPointY + dragOffsetY;windowManager.updateViewLayout(dragImageView, windowParams);}int tempPosition = pointToPosition(x, y);if(tempPosition!=INVALID_POSITION){dragPosition = tempPosition;}//滚动if(y<upScrollBounce||y>downScrollBounce){//使用setSelection来实现滚动setSelection(dragPosition);}}8.放下影像,数据更新。
Android实现拖动效果的两种方法
Android实现拖动效果的两种⽅法因为最近项⽬的需要,需要实现⼀个拖动效果,看了⼀下⽹上刚好有这种拖动效果的demo,代码⼤概如下:private void initListener(){screenWidth = getScreenWidth(this);//获取屏幕宽度screenHeight = getScreenHeight(this) - getStatusHeight(MainActivity.this);//屏幕⾼度-状态栏testTv.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {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 top = v.getTop() + dy;int left = v.getLeft() + dx;if (top <= 0) {top = 0;}if (top >= screenHeight - testTv.getHeight() ) {top = screenHeight - testTv.getHeight();}if (left >= screenWidth - testTv.getWidth()) {left = screenWidth - testTv.getWidth();}if (left <= 0) {left = 0;}yout(left, top, left+v.getWidth(), top+v.getHeight());v.postInvalidate();lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP:break;}return true;//这⾥根据项⽬需要选择false与true}});}可是我的项⽬本⾝是有涂鸦的界⾯,还有很多复杂的事件,发现会有很奇怪的效果,抖动很厉害,⽽且时不时回到原来的位置,后来发现这个yout(left, top, left+v.getWidth(), top+v.getHeight());可能不适合项⽬的需求,所以我想了另⼀种解法。
安卓(android)垂直拖动条的两种实现方式,
其中一种方法package com.styleflying.demon.player;import android.content.Context;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.util.AttributeSet;import android.util.Log;import android.view.KeyEvent;import android.view.MotionEvent;import android.view.View;import android.widget.AbsSeekBar;public class VerticalSeekBar extends AbsSeekBar {private Drawable mThumb;private int height;private int width;public interface OnSeekBarChangeListener {void onProgressChanged(V erticalSeekBar VerticalSeekBar, int progress, boolean fromUser);void onStartTrackingTouch(VerticalSeekBar VerticalSeekBar);void onStopTrackingTouch(VerticalSeekBar VerticalSeekBar);}private OnSeekBarChangeListener mOnSeekBarChangeListener;public VerticalSeekBar(Context context) {this(context, null);}public VerticalSeekBar(Context context, AttributeSet attrs) {this(context, attrs, android.R.attr.seekBarStyle);}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);}public void setOnSeekBarChangeListener(OnSeekBarChangeListener l) {mOnSeekBarChangeListener = l;}void onStartTrackingTouch() {if (mOnSeekBarChangeListener != null) {mOnSeekBarChangeListener.onStartTrackingTouch(this);}}void onStopTrackingTouch() {if (mOnSeekBarChangeListener != null) {mOnSeekBarChangeListener.onStopTrackingTouch(this);}}void onProgressRefresh(float scale, boolean fromUser) {Drawable thumb = mThumb;if (thumb != null) {setThumbPos(getHeight(), thumb, scale, Integer.MIN_VALUE);invalidate();}if (mOnSeekBarChangeListener != null) {mOnSeekBarChangeListener.onProgressChanged(this, getProgress(), fromUser);}}private void setThumbPos(int w, Drawable thumb, float scale, int gap) {int available = w+getPaddingLeft()-getPaddingRight();int thumbWidth = thumb.getIntrinsicWidth();int thumbHeight = thumb.getIntrinsicHeight();available -= thumbWidth;// The extra space for the thumb to move on the trackavailable += getThumbOffset() * 2;int thumbPos = (int) (scale * available);int topBound, bottomBound;if (gap == Integer.MIN_V ALUE) {Rect oldBounds = thumb.getBounds();topBound = oldBounds.top;bottomBound = oldBounds.bottom;} else {topBound = gap;bottomBound = gap + thumbHeight;}thumb.setBounds(thumbPos, topBound, thumbPos + thumbWidth, bottomBound);}protected void onDraw(Canvas c){c.rotate(-90);c.translate(-height,0);super.onDraw(c);}protected synchronized void onMeasure(int widthMeasureSpec, int heightMeasureSpec){width = 28;height = 120;// height = View.MeasureSpec.getSize(heightMeasureSpec);// width = View.MeasureSpec.getSize(widthMeasureSpec);this.setMeasuredDimension(width, height);}@Overridepublic void setThumb(Drawable thumb){mThumb = thumb;super.setThumb(thumb);}protected void onSizeChanged(int w, int h, int oldw, int oldh){super.onSizeChanged(h, w, oldw, oldh);}public boolean onTouchEvent(MotionEvent event) {if (!isEnabled()) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:setPressed(true);onStartTrackingTouch();trackTouchEvent(event);break;case MotionEvent.ACTION_MOVE:trackTouchEvent(event);attemptClaimDrag();break;case MotionEvent.ACTION_UP:trackTouchEvent(event);onStopTrackingTouch();setPressed(false);break;case MotionEvent.ACTION_CANCEL:onStopTrackingTouch();setPressed(false);break;}return true;}private void trackTouchEvent(MotionEvent event) {final int Height = getHeight();final int available = Height - getPaddingBottom() - getPaddingTop();int Y = (int)event.getY();float scale;float progress = 0;if (Y > Height - getPaddingBottom()) {scale = 0.0f;} else if (Y < getPaddingTop()) {scale = 1.0f;} else {scale = (float)(Height - getPaddingBottom()-Y) / (float)available;}final int max = getMax();progress = scale * max;setProgress((int) progress);}private void attemptClaimDrag() {if (getParent() != null) {getParent().requestDisallowInterceptTouchEvent(true);}}public boolean dispatchKeyEvent(KeyEvent event) {if(event.getAction()==KeyEvent.ACTION_DOWN){KeyEvent newEvent = null;switch(event.getKeyCode()){case KeyEvent.KEYCODE_DPAD_UP:newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_RIGHT);break;case KeyEvent.KEYCODE_DPAD_DOWN:newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_LEFT);break;case KeyEvent.KEYCODE_DPAD_LEFT:newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_DOWN);break;case KeyEvent.KEYCODE_DPAD_RIGHT:newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,KeyEvent.KEYCODE_DPAD_UP);break;default:newEvent = new KeyEvent(KeyEvent.ACTION_DOWN,event.getKeyCode());break;}return newEvent.dispatch(this);}return false;}}第二种public class VerticalSeekBar extends SeekBar {public VerticalSeekBar(Context context) {super(context);}public VerticalSeekBar(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle);}public VerticalSeekBar(Context context, AttributeSet attrs) {super(context, attrs);}protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(h, w, oldh, oldw);}@Overrideprotected synchronized void onMeasure(int widthMeasureSpec,int heightMeasureSpec) {super.onMeasure(heightMeasureSpec, widthMeasureSpec); setMeasuredDimension(getMeasuredHeight(), getMeasuredWidth()); }protected void onDraw(Canvas c) {c.rotate(-90);c.translate(-getHeight(), 0);super.onDraw(c);}@Overridepublic boolean onTouchEvent(MotionEvent event) {if (!isEnabled()) {return false;}switch (event.getAction()) {case MotionEvent.ACTION_DOWN:case MotionEvent.ACTION_MOVE:case MotionEvent.ACTION_UP:setProgress(getMax()- (int) (getMax() * event.getY() / getHeight()));onSizeChanged(getWidth(), getHeight(), 0, 0);break;case MotionEvent.ACTION_CANCEL:break;}return true;}}。
在androidActivity中实现图片的拖动
在android Activity中实现图片的拖动1.图片在Activity中的固定区域上下移动使用到ImageView,和TranslateAnimation控制位置变化的动画类进行操作。
2.第一步是在xml文件中添加图片控件ImageView并且引用资源文件中的相应图片。
第二步在正文文件中设置ImageView类型的变量imageview,并且用findViewById()将变量imageview与xml中的ImageView相关联,在正文文件中设置imageview 将它与监听器绑定运用TranslateAnimation translationAnimation = new TranslateAnimation(ENDSTART_X-20, ENDSTART_X-20, endY+10, endY+10); //图片转移imageview.startAnimation(translationAnimation);开始动画置3.TranslateAnimation(float from XDelta,float toXDelta,floatfromYDelta,float toYDelta)(位置变化动画)4.获取屏幕长宽:WindowManager windowManager =getWindowManager();Display display = windowManager.getDefaultDisplay();screenWidth = display.getWidth();screenHeight = display.getHeight();5.FrameLayout是最简单的一个布局对象。
它被定制为你屏幕上的一个空白备用区域,之后你可以在其中填充一个单一对象—比如,一张你要发布的图片。
所有的子元素将会固定在屏幕的左上角;你不能为FrameLayout中的一个子元素指定一个位置。
Android实现控件拖动效果
Android实现控件拖动效果本⽂实例为⼤家分享了Android实现控件拖动效果的具体代码,供⼤家参考,具体内容如下1.今天突然想到做个实现个控件拖动效果,就来试试,⼀查原来还是很简单的2.原理就是实现OnTouchLinstener,然后触摸屏幕时改变控件的位置,当然了会有⼈问OnTouch与OnClick有什么区别,百度搜⼀下就知道了,懒得说。
3.废话不多说直接看图4.当然了,笔者在点击和拖动的时候更改了ImageView的图⽚,离开屏幕时恢复,很简单,但很实⽤的⼀点,直接上代码吧package com.xugongming38.dragview;import android.content.Context;import android.content.SharedPreferences;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.MotionEvent;import android.view.View;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnTouchListener{private ImageView iv_dv_view;private int sx;private int sy;private SharedPreferences sp;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);if (getSupportActionBar() != null){getSupportActionBar().hide();}sp = this.getSharedPreferences("config", Context.MODE_PRIVATE);iv_dv_view = (ImageView) this.findViewById(R.id.iv_dv_view);sp = this.getSharedPreferences("config", Context.MODE_PRIVATE);iv_dv_view.setOnTouchListener(this);}@Overrideprotected void onResume() {super.onResume();}@Overridepublic boolean onTouch(View v, MotionEvent event) {switch (v.getId()) {// 如果⼿指放在imageView上拖动case R.id.iv_dv_view:// event.getRawX(); //获取⼿指第⼀次接触屏幕在x⽅向的坐标switch (event.getAction()) {case MotionEvent.ACTION_DOWN:// 获取⼿指第⼀次接触屏幕sx = (int) event.getRawX();sy = (int) event.getRawY();iv_dv_view.setImageResource(R.drawable.t);break;case MotionEvent.ACTION_MOVE:// ⼿指在屏幕上移动对应的事件int x = (int) event.getRawX();int y = (int) event.getRawY();// 获取⼿指移动的距离int dx = x - sx;int dy = y - sy;// 得到imageView最开始的各顶点的坐标int l = iv_dv_view.getLeft();int r = iv_dv_view.getRight();int t = iv_dv_view.getTop();int b = iv_dv_view.getBottom();// 更改imageView在窗体的位置iv_dv_yout(l + dx, t + dy, r + dx, b + dy);// 获取移动后的位置sx = (int) event.getRawX();sy = (int) event.getRawY();break;case MotionEvent.ACTION_UP:// ⼿指离开屏幕对应事件// 记录最后图⽚在窗体的位置int lasty = iv_dv_view.getTop();int lastx = iv_dv_view.getLeft();iv_dv_view.setImageResource(R.drawable.next);SharedPreferences.Editor editor = sp.edit();editor.putInt("lasty", lasty);editor.putInt("lastx", lastx);mit();break;}break;}return true;// 不会中断触摸事件的返回}}5.最后留⼀点笔记,关于ImageView的设置图像问题void android.widget.ImageView.setImageResource(int resId)与xml中的src的属性才是相匹配的void android.view.View.setBackgroundResource(int resid)与xml中的background的属性才是相匹配的,//从名字就看出来了。
Android开发实现可拖动排序的ListView功能【附源码下载】
Android开发实现可拖动排序的ListView功能【附源码下载】本⽂实例讲述了Android开发实现可拖动排序的ListView功能。
分享给⼤家供⼤家参考,具体如下:⼀、上图⼆、简述1、需要实现的效果是长按右侧可拖动部分布局实现列表项的拖动排序2、当点击列表项前⾯的单选按钮时,在该条⽬右侧显⽰删除图标,点击该图标删除当前条⽬。
三、实现思路借助github上的开源代码drag-sort-listview-master加以改造。
四、主要源码展⽰1、Activity代码package com.gengducun.dslvdemo;import java.util.ArrayList;import android.app.Activity;import android.os.Bundle;import android.widget.ListView;import com.mobeta.android.dslv.DragSortListView;public class MainActivity extends Activity {protected static final String TAG = "MainActivity";/**产品信息列表**/private ArrayList<ProductInfoBean> productInfoList;/**产品列表控件**/private DragSortListView mDslvProductList;/**产品信息列表*/private ProductListAdapter mProductListAdapter;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);mDslvProductList = (DragSortListView) findViewById(R.id.dslv_product_list);initProductList();mProductListAdapter = new ProductListAdapter(productInfoList, this);mDslvProductList.setAdapter(mProductListAdapter);mDslvProductList.setDropListener(onDrop);mDslvProductList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);}private DragSortListView.DropListener onDrop = new DragSortListView.DropListener() {@Overridepublic void drop(int from, int to) {if (from != to) {ProductInfoBean item = (ProductInfoBean) mProductListAdapter.getItem(from);mProductListAdapter.remove(item);mProductListAdapter.insert(item,from, to);mDslvProductList.moveCheckState(from, to);}}};private void initProductList() {productInfoList = new ArrayList<ProductInfoBean>();ProductInfoBean productInfo1 = new ProductInfoBean("EURUSD1");ProductInfoBean productInfo2 = new ProductInfoBean("EURUSD2");ProductInfoBean productInfo3 = new ProductInfoBean("EURUSD3");ProductInfoBean productInfo4 = new ProductInfoBean("EURUSD4");ProductInfoBean productInfo5 = new ProductInfoBean("EURUSD5");ProductInfoBean productInfo6 = new ProductInfoBean("EURUSD6");ProductInfoBean productInfo7 = new ProductInfoBean("EURUSD7");productInfoList.add(productInfo1);productInfoList.add(productInfo2);productInfoList.add(productInfo3);productInfoList.add(productInfo4);productInfoList.add(productInfo5);productInfoList.add(productInfo6);productInfoList.add(productInfo7);}}2、Adapter代码package com.gengducun.dslvdemo;import java.util.ArrayList;import android.content.Context;import android.util.Log;import youtInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RadioButton;import android.widget.TextView;public class ProductListAdapter extends BaseAdapter {private static final String TAG = "ProductListAdapter1";/**产品信息列表*/private ArrayList<ProductInfoBean> productInfoList;/**上下⽂*/private Context mContext;/**布局加载器*/private LayoutInflater mInflater;/**布局缓存*/private ViewHolder mHolder;/**本类适配器对象**/private ProductListAdapter mProductListAdapter1;/**选中项位置**/private int mSelectPosition = -1;public ProductListAdapter(ArrayList<ProductInfoBean> productInfoList, Context context) { super();this.productInfoList = productInfoList;this.mContext = context;this.mInflater = LayoutInflater.from(context);this.mProductListAdapter1 = this;}@Overridepublic int getCount() {return null == productInfoList ? 0 : productInfoList.size();}@Overridepublic Object getItem(int position) {return productInfoList.get(position);}@Overridepublic long getItemId(int position) {return position;}public int getmSelectPosition() {return mSelectPosition;}public void setmSelectPosition(int mSelectPosition) {this.mSelectPosition = mSelectPosition;}/*** 删除产品* @param productInfoBean*/public void remove(ProductInfoBean productInfoBean) {synchronized (this) {productInfoList.remove(productInfoBean);}notifyDataSetChanged();}/*** 将产品移动到指定的位置* @param productInfoBean* @param from 移动之前的位置* @param to 移动完成之后,该产品所在的位置*/public void insert(ProductInfoBean productInfoBean, int from, int to) {synchronized (this) {Log.i(TAG, "from=" + from + " to =" + to);if (mSelectPosition != -1) {//有选中项的前提下if ((from < mSelectPosition && to < mSelectPosition) || (from > mSelectPosition && to > mSelectPosition)) { //在选中项之前的位置进⾏拖拉或者在选中项之后的区域拖拉,不会影响选中项} else if (from < mSelectPosition && to > mSelectPosition) {//将选中项之前的移动到选中项之后的位置,则选中项的索引需要发⽣变化,应该是选中项的位置-1mSelectPosition = mSelectPosition - 1;} else if (from > mSelectPosition && to < mSelectPosition) {//将选中项之后的项移动到选中项之前的位置,索引也需要变化,应该是选中项的位置+1mSelectPosition = mSelectPosition + 1;} else if ((from == mSelectPosition && from > to) || (from == mSelectPosition && from < to)) {//如果将选中项往选中项前⾯的⽅向拖,则选中项的索引也需要变化,应该是拖动到的位置mSelectPosition = to;} else if ((from < mSelectPosition && to == mSelectPosition)) {//将选中项之前的移动到当前选中项的位置,索引需要变化,选中项的索引应该是选中项的值-1mSelectPosition = mSelectPosition - 1;} else if (from > mSelectPosition && to == mSelectPosition) {//将选中项之后的移动到当前项的位置,索引需要变化,选中项的索引应该是选中项的值+1mSelectPosition = mSelectPosition + 1;}}productInfoList.add(to, productInfoBean);}notifyDataSetChanged();}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (null == convertView) {convertView = mInflater.inflate(yout.list_item_product_list_1, null);mHolder = new ViewHolder();mHolder.rbSelect = (RadioButton) convertView.findViewById(R.id.rb_select);PurductName = (TextView) convertView.findViewById(_product_name);mHolder.llDragLayout = (LinearLayout) convertView.findViewById(R.id.drag_handle);mHolder.ivDrag = (ImageView) convertView.findViewById(R.id.iv_drag);mHolder.ivDeleteProduct = (ImageView) convertView.findViewById(R.id.iv_product_delete);convertView.setTag(mHolder);} else {mHolder = (ViewHolder) convertView.getTag();}ProductInfoBean productInfoBean = productInfoList.get(position);if (null != productInfoBean) {//设置单选按钮的选中状态if (mSelectPosition == position) {mHolder.rbSelect.setChecked(true);mHolder.ivDrag.setVisibility(View.GONE);mHolder.ivDeleteProduct.setVisibility(View.VISIBLE);mHolder.ivDeleteProduct.setOnClickListener(new RemoveItemClickListener(mSelectPosition));} else {mHolder.rbSelect.setChecked(false);mHolder.ivDrag.setVisibility(View.VISIBLE);mHolder.ivDeleteProduct.setVisibility(View.GONE);}mHolder.rbSelect.setOnClickListener(new ProductClickListener(position));//设置产品名称if (null != productInfoBean.getProductName() && !("".equals(productInfoBean.getProductName()))) {PurductName.setText(productInfoBean.getProductName());}}return convertView;}class ViewHolder {RadioButton rbSelect;TextView tvPurductName;LinearLayout llDragLayout;ImageView ivDrag;ImageView ivDeleteProduct;}/*** 单选按钮事件监听* @author Wilson*/class ProductClickListener implements OnClickListener {private int position;public ProductClickListener(int position) {super();this.position = position;}@Overridepublic void onClick(View v) {if (mSelectPosition == position) {mSelectPosition = -1;} else {mSelectPosition = position;}Log.i(TAG, "mSelectPosition=" + mSelectPosition + " position=" + position);mProductListAdapter1.notifyDataSetChanged();}}/*** 删除当前产品项监听事件*/class RemoveItemClickListener implements OnClickListener {private int position;public RemoveItemClickListener(int position) {super();this.position = position;}@Overridepublic void onClick(View v) {//1、删除集合中的数据productInfoList.remove(position);//2、删除服务器端的数据mProductListAdapter1.notifyDataSetChanged();//mSelectPosition = -1;}}}四、源码完整实例代码点击此处。
Android实现图片浮动随意拖拽效果
Android实现图⽚浮动随意拖拽效果本⽂实例为⼤家分享了Android实现图⽚浮动拖拽效果的具体代码,供⼤家参考,具体内容如下实现步骤1.先⾃定义⼀个浮动⼯具类public class MoveImage extends ImageView {/**** 浮动⼯具类**/private int lastX = 0;private int lastY = 0;private int dx;private int dy;private float movex = 0;private float movey = 0;private int screenWidth;private int screenHeight;public MoveImage(Context context, AttributeSet attrs) {super(context, attrs);screenWidth = ScreenUtils.getWidth(context);screenHeight = ScreenUtils.getHeight(context);}@Overridepublic boolean onTouchEvent(MotionEvent event) {switch (event.getAction()) {case MotionEvent.ACTION_DOWN:lastX = (int) event.getRawX();lastY = (int) event.getRawY();movex = lastX;movey = lastY;break;case MotionEvent.ACTION_MOVE:dx = (int) event.getRawX() - lastX;dy = (int) event.getRawY() - lastY;int left = getLeft() + dx;int top = getTop() + dy;int right = getRight() + dx;int bottom = getBottom() + dy;if (left < 0) {left = 0;right = left + getWidth();}if (right > screenWidth) {right = screenWidth;left = right - getWidth();}if (top < 0) {top = 0;bottom = top + getHeight();}if (bottom > screenHeight) {bottom = screenHeight;top = bottom - getHeight();}layout(left, top, right, bottom);lastX = (int) event.getRawX();lastY = (int) event.getRawY();break;case MotionEvent.ACTION_UP://避免滑出触发点击事件if ((int) (event.getRawX() - movex) != 0|| (int) (event.getRawY() - movey) != 0) {return true;}break;default:break;}return super.onTouchEvent(event);}}2.xml布局的引⽤<com.zjtd.bzcommunity.text.MoveImageandroid:id="@+id/iv_phone_bar"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_alignParentRight="true"android:layout_marginBottom="70dp"android:src="@drawable/my_qiandao_icon" />3.activity的实现private MoveImage iv_phone_bar;//签到图⽚iv_phone_bar = (MoveImage) view.findViewById(R.id.iv_phone_bar);iv_phone_bar.setOnClickListener(this);// 签到case R.id.iv_phone_bar:startActivity(new Intent(getActivity(), SignAcitvity.class));//点击跳转页⾯break;以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
android imageview 多点触碰(MultiTouch)实现图片拖拽移动缩放
刚用android手机发现手机自带的图片浏览器挺酷可以用手指移动缩放还有动画效果Intent intent = new Intent(Intent.ACTION_VIEW);intent.setDataAndType(Uri.fromFile(recentFile), "image/*");startActivity(intent);就可以调用系统的图片浏览器查看手机上的图片了于是想仿照着写一个到网上看了不少资料大概分为两种实现方式/source/3318880 ->源码一种是利用Matrix的postTranslate和postScale方法分别进行移动和缩放这种方式实质是对ImageView中的drawable进行缩放和移动imageview组件本身并没有移动和缩放这种方法实现起来比较简单但是不知道如何获得经过移动后的drawable的坐标和大小比较郁闷因为调用imageview的各种方法拿到的都是其本身的大小和坐标而另一种是直接对imageview进行操作,直接移动和改变组件本身的大小从而实现移动和缩放核心类继承->ImageView 并加入了一些动画效果import android.content.Context;import android.util.FloatMath;import android.view.MotionEvent;import android.view.animation.TranslateAnimation;import android.widget.ImageView;/*** 继承ImageView 实现了多点触碰的拖动和缩放* @author Administrator**/publicclassTouchViewextendsImageView{staticfinalint NONE =0;staticfinalint DRAG =1;//拖动中staticfinalint ZOOM =2;//缩放中staticfinalint BIGGER =3;//放大ingstaticfinalint SMALLER =4;//缩小ingprivateint mode = NONE;//当前的事件privatefloat beforeLenght;//两触点距离privatefloat afterLenght;//两触点距离privatefloat scale =0.04f;//缩放的比例 X Y方向都是这个值越大缩放的越快privateint screenW;privateint screenH;/*处理拖动变量 */privateint start_x;privateint start_y;privateint stop_x ;privateint stop_y ;privateTranslateAnimation trans;//处理超出边界的动画publicTouchView(Context context,int w,int h){super(context);this.setPadding(0,0,0,0);screenW = w;screenH = h;}/*** 就算两点间的距离*/privatefloat spacing(MotionEventevent){float x =event.getX(0)-event.getX(1);float y =event.getY(0)-event.getY(1);returnFloatMath.sqrt(x * x + y * y);}/*** 处理触碰..*/@Overridepublicboolean onTouchEvent(MotionEventevent){switch(event.getAction()&MotionEvent.ACTION_MASK){caseMotionEvent.ACTION_DOWN:mode = DRAG;stop_x =(int)event.getRawX();stop_y =(int)event.getRawY();start_x =(int)event.getX();start_y = stop_y -this.getTop();if(event.getPointerCount()==2)beforeLenght = spacing(event);break;caseMotionEvent.ACTION_POINTER_DOWN:if(spacing(event)>10f){mode = ZOOM;beforeLenght = spacing(event);}break;caseMotionEvent.ACTION_UP:/*判断是否超出范围并处理*/int disX =0;int disY =0;if(getHeight()<=screenH ||this.getTop()<0){if(this.getTop()<0){int dis = getTop();yout(this.getLeft(),0,this.getRight(),0+this.getHeight());disY = dis - getTop();}elseif(this.getBottom()>screenH){disY = getHeight()- screenH+getTop();yout(this.getLeft(), screenH-getHeight(),this.getRight(), screenH); }}if(getWidth()<=screenW){if(this.getLeft()<0){disX = getLeft();yout(0,this.getTop(),0+getWidth(),this.getBottom());}elseif(this.getRight()>screenW){disX = getWidth()-screenW+getLeft();yout(screenW-getWidth(),this.getTop(), screenW,this.getBottom()); }}if(disX!=0|| disY!=0){trans =newTranslateAnimation(disX,0, disY,0);trans.setDuration(500);this.startAnimation(trans);}mode = NONE;break;caseMotionEvent.ACTION_POINTER_UP:mode = NONE;break;caseMotionEvent.ACTION_MOVE:/*处理拖动*/if(mode == DRAG){if(Math.abs(stop_x-start_x-getLeft())<88&&Math.abs(stop_y - start_y-getTop())<85) {this.setPosition(stop_x - start_x, stop_y - start_y, stop_x +this.getWidth()- start_x, stop_y - start_y +this.getHeight());stop_x =(int)event.getRawX();stop_y =(int)event.getRawY();}}/*处理缩放*/elseif(mode == ZOOM){if(spacing(event)>10f){afterLenght = spacing(event);float gapLenght = afterLenght - beforeLenght;if(gapLenght ==0){break;}elseif(Math.abs(gapLenght)>5f){if(gapLenght>0){this.setScale(scale,BIGGER);}else{this.setScale(scale,SMALLER);}beforeLenght = afterLenght;}}}break;}returntrue;}/*** 实现处理缩放*/privatevoid setScale(float temp,int flag){if(flag==BIGGER){this.setFrame(this.getLeft()-(int)(temp*this.getWidth()),this.getTop()-(int)(temp*this.getHeight()),this.getRight()+(int)(temp*this.getWidth()),this.getBottom()+(int)(temp*this.getHeight()));}elseif(flag==SMALLER){this.setFrame(this.getLeft()+(int)(temp*this.getWidth()),this.getTop()+(int)(temp*this.getHeight()),this.getRight()-(int)(temp*this.getWidth()),this.getBottom()-(int)(temp*this.getHeight()));}}/*** 实现处理拖动*/privatevoid setPosition(int left,int top,int right,int bottom){ yout(left,top,right,bottom);}}装载类一个layoutimport android.app.Activity;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.view.View;import android.widget.AbsoluteLayout;import android.widget.ImageView.ScaleType;/*** 一个绝对布局* @author Administrator**/@SuppressWarnings("deprecation") publicclassViewScrollextendsAbsoluteLayoutprivateint screenW;//可用的屏幕宽privateint screenH;//可用的屏幕高总高度-上面组件的总高度privateint imgW;//图片原始宽privateint imgH;//图片原始高privateTouchView tv;publicViewScroll(Context context,int resId,View topView){super(context);screenW =((Activity)context).getWindowManager().getDefaultDisplay().getWidth(); screenH=((Activity)context).getWindowManager().getDefaultDisplay().getHeight()-(topVie w==null?190:topView.getBottom()+50);tv =newTouchView(context,screenW,screenH);tv.setImageResource(resId);Bitmap img =BitmapFactory.decodeResource(context.getResources(), resId);imgW = img.getWidth();imgH = img.getHeight();int layout_w = imgW>screenW?screenW:imgW;//实际显示的宽int layout_h = imgH>screenH?screenH:imgH;//实际显示的高if(layout_w==screenW||layout_h==screenH)tv.setScaleType(ScaleType.FIT_XY);tv.setLayoutParams(youtParams(layout_w,layout_h , layout_w==screenW?0:(screenW-layout_w)/2,layout_h==screenH?0:(screenH-layout_h)/2));this.addView(tv);}}Activity:import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.Gallery;import android.widget.LinearLayout;import android.widget.AdapterView.OnItemClickListener;/*** activity* @author Administrator**/publicclassGalleryMainextendsActivityimplementsOnItemClickListenerprivateViewScroll detail;privateImageAdapter ia;privateLinearLayout ll;youtParams parm;privateGallery g;@Overrideprotectedvoid onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);g =(Gallery) findViewById(R.id.myggg);ll =(LinearLayout) findViewById(R.id.twill);parm=youtParams(youtParams.FILL_PARENT,LinearLayou youtParams.FILL_PARENT);ia =newImageAdapter(this);detail =newViewScroll(GalleryMain.this, ia.imgIds[0],g);ll.addView(detail,parm);g.setAdapter(ia);g.setOnItemClickListener(this);}@Overridepublicvoid onItemClick(AdapterView<?> arg0,View arg1,int arg2,long arg3){ll.removeView(detail);detail =newViewScroll(GalleryMain.this, ia.imgIds[arg2],g);ll.addView(detail,parm);}}配合Gallery的适配器类:import android.content.Context;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Gallery;import android.widget.ImageView;import android.widget.ImageView.ScaleType;/*** Gallery的适配器类* @author Administrator*/publicclassImageAdapterextendsBaseAdapter{/*图片素材*/publicint[] imgIds ={R.drawable.jpg,R.drawable.pic}; privateContext context;publicImageAdapter(Context context){this.context = context;}@Overridepublicint getCount(){return imgIds.length;}@OverridepublicObject getItem(int position){returnnull;}@Overridepubliclong getItemId(int position){return0;}@OverridepublicView getView(int position,View convertView,ViewGroup parent) {ImageView img =newImageViewImp(context);img.setImageResource(imgIds[position]);img.setScaleType(ScaleType.CENTER);img.setLayoutParams(youtParams(155,150));return img;}}gallery中image的实现类:import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Matrix;import android.graphics.Paint;import android.graphics.drawable.BitmapDrawable; import android.view.MotionEvent;import android.widget.ImageView;/*** ImageAdapter中ImageView的实现类* @author Administrator**/publicclassImageViewImpextendsImageView{privateint alpha =250;privateboolean pressed =false; publicImageViewImp(Context context){super(context);}Matrix m;publicvoid show(){newThread(){publicvoid run(){int time =2000;try{pressed =true;while(time>0){Thread.sleep(200);time -=200;alpha-=25;postInvalidate();}pressed =false;}catch(Exception e){e.printStackTrace();}};}.start();}@Overridepublicboolean onTouchEvent(MotionEventevent){if(event.getAction()==MotionEvent.ACTION_DOWN)show();returnfalse;}@Overrideprotectedvoid onDraw(Canvas canvas){Paint p =newPaint();p.setColor(Color.WHITE);p.setStyle(Paint.Style.STROKE);p.setStrokeWidth(10);BitmapDrawable bd =(BitmapDrawable) getDrawable();if(bd!=null){canvas.drawBitmap(imageScale(bd.getBitmap(),107,113),21,18, p);}canvas.drawBitmap(BitmapFactory.decodeResource(getContext().getResources(), R.drawable.kua),0,0, p);if(isPressed()){canvas.drawRect(5,5,140,140,p);}if(pressed){p.setAlpha(alpha);canvas.drawRect(5,5,140,140,p);}}publicstaticBitmap imageScale(Bitmap bitmap,int dst_w,int dst_h){int src_w = bitmap.getWidth();int src_h = bitmap.getHeight();float scale_w =((float)dst_w)/src_w;float scale_h =((float)dst_h)/src_h;Matrix matrix =newMatrix();matrix.postScale(scale_w, scale_h);Bitmap dstbmp =Bitmap.createBitmap(bitmap,0,0, src_w, src_h, matrix,true); return dstbmp;}}各种xml ->布局-> style -> color:<?xml version="1.0" encoding="utf-8"?><!--main.xml 在layout下--><LinearLayoutxmlns:android="/apk/res/android" android:orientation="vertical"android:layout_height="fill_parent"android:layout_width="fill_parent"android:gravity="top"android:id="@+id/twill" android:background="@android:color/transparent"><Galleryandroid:id="@+id/myggg"android:layout_width="fill_parent"android:layout_height="wrap_content"/></LinearLayout><?xml version="1.0" encoding="utf-8"?><!--style.xml 在values下--><resources><stylename="testStyle"><itemname="android:textColor">#EC9237</item></style><stylename="transparent"><itemname="android:windowBackground">@drawable/translucent_background</item> <itemname="android:windowIsTranslucent">true</item></style></resources><?xml version="1.0" encoding="utf-8"?><!--color.xml 在values下--><resources><drawablename="c1">#FFFFFFFF</drawable><drawablename="c2">#00FFFF</drawable><drawablename="translucent_background">#7F000000</drawable> </resources>。
Android自定义view实现拖拽选择按钮
Android⾃定义view实现拖拽选择按钮本⽂实例为⼤家分享了Android实现拖拽选择按钮的具体代码,供⼤家参考,具体内容如下DragChooseDemo效果图Attributes属性(布局⽂件中的⾃定义属性)半径、⽂字⼤⼩、按钮个数注意配合使⽤,以达到最佳效果⽅法使⽤布局⽂件中的使⽤<com.xuezj.dragchooselibrary.view.DragChooseViewandroid:id="@+id/my_view"android:layout_width="wrap_content"android:layout_height="wrap_content"choose:background_color="#efeff4"choose:border_color="#ffcfcfd3"choose:enabled="@mipmap/sliderwifion"choose:focused="@mipmap/sliderwifioff"choose:text_size="12sp"choose:counts="5"choose:radius="20" />代码中调⽤dragChooseView =(DragChooseView)findViewById(R.id.my_view);dragChooseView.setTextData("⾃定义","单选","双选","全选","sss","ddd"); dragChooseView.addOnChooseItemListener(new DragChooseView.OnChooseItemListener() {@Overridepublic void chooseItem(int index, String text) {Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show();}});以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
AndroidViewDragHelper实现京东、淘宝拖拽详情功能的实现
AndroidViewDragHelper实现京东、淘宝拖拽详情功能的实现先上效果图,如果⼤家感觉不错,请参考实例代码,效果图如下所述:要实现这个效果有三种⽅式:①⼿势②动画③ ViewDragHelper这⾥我使⽤的是ViewDragHelper类.public class ViewDragLayout extends ViewGroup {//垂直⽅向的滑动速度private static final int VEL_THRESHOLD = 300;//垂直⽅向的滑动距离private static final int DISTANCE_THRESHOLD = 300;//上⾯可见的Viewprivate View mTopView;//下⾯详情Viewprivate View mBottomView;//ViewDragHelper实例private ViewDragHelper mViewDragHelper;private GestureDetectorCompat mGestureDetectorCompat;private int mFirstHeight;public ViewDragLayout(Context context) {super(context);init();}public ViewDragLayout(Context context, AttributeSet attrs) {super(context, attrs);init();}public ViewDragLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)public ViewDragLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);init();}private void init() {mViewDragHelper = ViewDragHelper.create(this, 1.0f, new DragHelperCallback());mGestureDetectorCompat = new GestureDetectorCompat(getContext(), new YScrollDetector());}@Overrideprotected void onFinishInflate() {super.onFinishInflate();mTopView = getChildAt(0);mBottomView = getChildAt(1);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {if (mTopView.getTop() == 0) {yout(l, 0, r, b-t );yout(l, 0, r, b-t );mFirstHeight = mTopView.getMeasuredHeight();mBottomView.offsetTopAndBottom(mFirstHeight);}else{yout(l, mTopView.getTop(), r, mTopView.getBottom());yout(l, mBottomView.getTop(), r, mBottomView.getBottom());}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {measureChildren(widthMeasureSpec,heightMeasureSpec);int maxWidth = MeasureSpec.getSize(widthMeasureSpec);int maxHeight = MeasureSpec.getSize(heightMeasureSpec);setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, 0),resolveSizeAndState(maxHeight, heightMeasureSpec, 0));}private class DragHelperCallback extends ViewDragHelper.Callback {@Overridepublic boolean tryCaptureView(View child, int pointerId) {return true;}/*** @param child* @param top* @param dy* @return*/@Overridepublic int clampViewPositionVertical(View child, int top, int dy) {int finalTop=top;if (child == mTopView) {if (top > 0) {finalTop=0;}}else if(child==mBottomView){if(top<0){finalTop=0;}}return finalTop;}@Overridepublic void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) { if (changedView == mTopView) {mBottomView.offsetTopAndBottom(dy);}else if (changedView==mBottomView){mTopView.offsetTopAndBottom(dy);}ViewCompat.postInvalidateOnAnimation(ViewDragLayout.this);}/**** @param releasedChild* @param xvel ⽔平⽅向的速度(向右为正)* @param yvel 竖直⽅向的速度(向下为正)*/@Overridepublic void onViewReleased(View releasedChild, float xvel, float yvel) {animTopOrBottom(releasedChild, yvel);}}//动画实现滚动private void animTopOrBottom(View releasedChild, float yvel) {int finalTop=0;if (releasedChild == mTopView) {if (yvel < -VEL_THRESHOLD || (releasedChild.getTop() < -DISTANCE_THRESHOLD)) { finalTop=-mFirstHeight;}} else if (releasedChild == mBottomView) {if (yvel > VEL_THRESHOLD || (releasedChild.getTop() > DISTANCE_THRESHOLD)) { finalTop=mFirstHeight;}}if (mViewDragHelper.smoothSlideViewTo(releasedChild, 0, finalTop)) {ViewCompat.postInvalidateOnAnimation(this);}}@Overridepublic void computeScroll() {if (mViewDragHelper.continueSettling(true)) {ViewCompat.postInvalidateOnAnimation(this);}}//是否拦截⼿势操作@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {if (mTopView.getTop() < 0 && mTopView.getBottom() > 0) {return false;}boolean isCanTouch = mGestureDetectorCompat.onTouchEvent(ev);boolean shouldIntercept = mViewDragHelper.shouldInterceptTouchEvent(ev);if (ev.getActionMasked() == MotionEvent.ACTION_DOWN) {mViewDragHelper.processTouchEvent(ev);}return isCanTouch&&shouldIntercept;}//将touch事件交给ViewDragHelper处理@Overridepublic boolean onTouchEvent(MotionEvent event) {mViewDragHelper.processTouchEvent(event);return true;}//垂直⽅向上才滚动private class YScrollDetector extends GestureDetector.SimpleOnGestureListener {@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {return Math.abs(distanceY) > Math.abs(distanceX);}}}使⽤ViewDragLayout<.widget.ViewDragLayoutandroid:id="@+id/view_drag_layout"android:layout_width="match_parent"android:layout_height="match_parent"><FrameLayoutandroid:id="@+id/top_fragment_view"android:layout_width="match_parent"android:layout_height="match_parent"/><FrameLayoutandroid:id="@+id/bottom_fragment_view"android:layout_width="match_parent"android:layout_height="match_parent"/></.widget.ViewDragLayout>bottom_fragment_view中使⽤了ScrollView,但是原⽣是不⾏的,所以这⾥我⼜将ScrollView重写了⼀下这⾥主要是处理dispatchTouchEvent(MotionEvent ev)⽅法,判断将touch事件交给⾃⼰处理还是交给⽗View处理public class CustomScrollView extends ScrollView {//滚动临界值private int mTouchSlop;//获取初始X坐标private float mRawX;//获取初始Y坐标private float mRawY;//是否向上滑动private boolean mCanScrollUp;//是否向下滑动private boolean mCanScrollDown;public CustomScrollView(Context context) {super(context);init();}public CustomScrollView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public CustomScrollView(Context context, @Nullable AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}private void init() {ViewConfiguration configuration = ViewConfiguration.get(getContext());mTouchSlop = configuration.getScaledTouchSlop();}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {switch (ev.getActionMasked()) {case MotionEvent.ACTION_DOWN:mRawX = ev.getRawX();mRawY = ev.getRawY();mCanScrollUp = canScrollingUp();mCanScrollDown = canScrollingDown();//表⽰⼦View要⾃⼰消费这次事件,告诉⽗View不拦截这次的事件。
android draganddrop原理
Android的拖放(Drag and Drop)机制是一种用户界面交互方式,它允许用户通过触摸屏幕上的对象并将其拖动到其他位置来执行操作。
在Android中,拖放操作通常用于移动、
复制或删除数据元素。
拖放操作的原理可以概括为以下几个步骤:
1. 用户选择一个可拖动的对象:用户可以通过长按或单击并拖动来选择一个可拖动的对象。
2. 对象被拖动:当用户选择一个对象后,该对象会变成可拖动的状态,并且可以被拖动到屏幕上的任何位置。
3. 目标位置的接收:当用户将对象拖动到屏幕上的某个位置时,该位置的目标对象或容器会接收该对象。
4. 执行操作:根据用户的意图,可以在目标位置执行不同的操作,如移动、复制或删除对象。
在Android中,拖放操作是通过触摸事件和视图层次结构来实现的。
当用户触摸屏幕上的一个对象时,系统会记录该对象的坐标和状态。
当用户将对象拖动到新的位置时,系统会更新该对象的坐标和状态。
当对象被拖动到目标位置时,系统会触发相应的触摸事件,并将该对象传递给目标对象或容器进行处理。
在实现拖放操作时,Android提供了相关的API和事件处理机制,以便开发者可以轻松地实现拖放功能。
例如,可以使用`View.OnLongClickListener`和`View.OnDragListener`等监听器来监听用户的触摸事件和拖放事件,从而实现拖放操作的交互逻辑。
同时,开发者还可以通过自定义视图和布局来实现更复杂的拖放效果和交互行为。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于Android图标拖动布局的实现
欧柏泰克:基于Android图标拖动布局的实现:
界面需求:
界面整齐的排列各个图标,长按其中一个,可拖动选中的图标。
拖动到想要的位置之后,界面可将图标再次排列整齐。
类似一般android手机桌面布局。
控件介绍:
Android为我们提供了GridView 网格视图。
GridView 可在控件内添加view子控件,实现view的整齐排列,但是GridView并没有给我们提供拖拽view的功能,因此需要重新编写GridView来实现需要的功能。
public class DragGrid extends GridView{}
如上述代码,重新定义一个DragGrid控件,继承于GridView。
Android事件处理:
事件是我们在与UI交互式发生的,我们点击一个按键时,可能就已经出发好几个事件,例如我们点击数字键“0”,他会涉及到按下事件,和一个弹起(松开)事件,在我们android中还可能涉及到触摸屏事件,所以在android系统中,事件是作为常用的功能之一。
而这里我用到的主要有两个:
1 长按LongClick;
2 触碰事件TouchEvent;
适配器Adapter:
适配器(Adapter)是一种界面对象,他用于列表组件和数据来源之间的桥梁。
在这里我们用于GridView的数据填充,以及拖动后的布局改变。
Android本身提供给我们的配置器不满足我们的需求因此也需要重写一个新的Adapter;
public class DateAdapter extends BaseAdapter {}
主要思路:
触发GridView的子控件的长按监听,需要重写GridView的LongClick的监听。
之后进入图标拖拽功能,此功能需要重写触碰事件TouchEvent。
但是仅仅如此,会带来一个问题,在没有长按的时候也会触发触碰事件TouchEvent。
因此我们需要一个机制来判断LongClick和TouchEvent的先后顺序,在LongClick触发之后才执行TouchEvent。
好在android为我们提供了另一个事件——onInterceptTouchEvent。
onInterceptTouchEvent是用于拦截手势事件的,每个手势事件都会先调用onInterceptTouchEvent。
重写GridView
的onInterceptTouchEvent使得在手指触碰屏幕的时候调用LongClick而不是TouchEvent,
就可以避免两者之间的矛盾。
之后使用Adapter对GridView的内容进行填充,即可完成布局。
具体实现与代码:
具体实现还需要还需要具体的页面布局。
布局文件分为两个,一个是主界面,之间调用重写的GridView即可。
另一个是GridView的item,我们可以用一个ImageView来显示图标,下面用一个TextView来注释名称。
而将item填充到GridView里就是Adapter的工作了。
获取item:
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(context).inflate(yout.item, null);
txtAge = (TextView) convertView.findViewById(R.id.txt_userAge);
txtAge.setText(lstDate.get(position));
return convertView;
}
}
将item填充到GridView中:
final DateAdapter adapter = new DateAdapter(MainActivity.this, l1);
gridView.setAdapter(adapter);
重写onInterceptTouchEvent:
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
return setOnItemLongClickListener(ev);
}
return super.onInterceptTouchEvent(ev);
}
ACTION_DOWN代表手指放下,此时返回setOnItemLongClickListener(ev)即可先执行长按监听。
重写TouchEvent:
public boolean onTouchEvent(MotionEvent ev) {
if (dragImageView != null
&& dragPosition != AdapterView.INVALID_POSITION) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()) {
case MotionEvent.ACTION_MOVE:
if(!isCountXY) {
xtox = x-mLastX;
ytoy = y-mLastY;
isCountXY= true;
}
onDrag(x, y);
if(!isMoving )
OnMove(x,y);
break;
case MotionEvent.ACTION_UP:
stopDrag();
onDrop(x, y);
break;
}
}
return super.onTouchEvent(ev);
}
重写LongClick事件:
public boolean setOnItemLongClickListener(final MotionEvent ev) {
this.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { @Override
public boolean onItemLongClick(AdapterView arg0, View arg1,
int arg2, long arg3) {
int x = (int) ev.getX();
int y = (int) ev.getY();
Bitmap bm = Bitmap.createBitmap(itemView.getDrawingCache(true));
Bitmap bitmap = Bitmap.createBitmap(bm, 8, 8, bm.getWidth()-8, bm.getHeight()-8);
startDrag(bitmap, x, y);
hideDropItem();
itemView.setVisibility(View.INVISIBLE);
isMoving = false;
return false;
};
});
return super.onInterceptTouchEvent(ev);
}
由于相关代码过于复杂,在此只做简单思路描述:x,y分别代表拖动item的初始坐标。
ACTION_MOVE代表手指在屏幕上滑动。
长按事件执行时,获取长按item的位置,和截图,隐藏原先Item。
事实上用户拖动的是item的截图,item本身是无法拖动的,但这不影响用户体验。
之后执行onTouchEvent,当“item”移动到新的位置是,使用动画效果使原先在此位置的item被挤到空位,当然这里的item移动也是一个障眼法。
而当手指松开的时候再利用Adapter重新排列item位置。
解除原先item的隐藏。
至此,android图标拖动布局的实现。