Android中怎么为View添加拖放效果
这篇文章主要介绍“Android中怎么为View添加拖放效果”,在日常操作中,相信很多人在Android中怎么为View添加拖放效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android中怎么为View添加拖放效果”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
1.引言在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好。
2.主要方法和类介绍2.1 startDragAndDrop()和startDrag()要实现View的拖放,需要调用View的startDragAndDrop()或startDrag()方法,其中startDragAndDrop()方法要求API版本为24或以上,调用方法后,View便可以拖动了,此方法需要传递的参数如下:
//data:拖放操作要传递的数据//shadowBuilder:拖放阴影//myLocalState:一个包含与拖放操作有关的数据的对象//flags:控制拖放操作的标志位publicfinalbooleanstartDragAndDrop(ClipDatadata,DragShadowBuildershadowBuilder,ObjectmyLocalState,intflags)2.2 setOnDragListener()
接收拖放事件的View我们暂且称之为目标View,目标View调用setOnDragListener(),并实现其中的方法onDrag()后可以接收拖放事件的回调。
2.3 View.DragShadowBuilder在拖放操作进行的时候,需要显示正在拖动的图片,View.DragShadowBuilder类提供了可以传入View的构造方法,这个View是被拖放的View,我们将通过DragShadowBuilder创建的拖动图片称为拖动阴影,这个将作为参数传入startDragAndDrop()或startDrag()方法中,如若有需要的话,还可以继承View.DragShadowBuilder类去实现自定义的效果。
2.4 DragEvent此类主要定义了拖放事件的类型,通过event.getAction()可以获取不同的事件类型,主要有以下几种:
//DragEvent.ACTION_DRAG_STARTED:表示拖动已经开始//DragEvent.ACTION_DRAG_ENTERED:表示拖动阴影已经进入目标View//DragEvent.ACTION_DRAG_LOCATION:拖动阴影在目标View边界内移动时会多次响应此事件//DragEvent.ACTION_DRAG_EXITED:表示拖动阴影离开了目标View的边界//DragEvent.ACTION_DROP:表示拖动阴影被释放//DragEvent.ACTION_DRAG_ENDED:表示拖放操作即将结束,在此处需要通过调用event.getResult()的返回值来判断拖放操作是否成功3. 演示将一张图片拖放到方框内
现在演示将一张图片拖放到方框内,来说明拖放操作的大致流程,其中方框是一个LinearLayout,为它设置了一个方框背景。
3.1 简易布局布局如下:
<?xmlversion="1.0"encoding="utf-8"?><RelativeLayoutxmlns: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"tools:context=".MainActivity"><ImageViewandroid:id="@+id/iv_drag"android:layout_width="100dp"android:layout_height="100dp"android:layout_centerHorizontal="true"android:src="@mipmap/ic_launcher"/><LinearLayoutandroid:id="@+id/ll_accept"android:layout_width="300dp"android:layout_height="300dp"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="50dp"android:background="@drawable/black_bac"android:orientation="vertical"></LinearLayout></RelativeLayout>3.2 操作被拖放的图片
实现长按拖动图片的效果,首先调用setOnLongClickListener()设置长按事件回调,之后构建ClipData和拖动阴影,然后调用startDragAndDrop()或startDrag()方法实现拖动,代码如下:
iv_drag.setOnLongClickListener(newView.OnLongClickListener(){@OverridepublicbooleanonLongClick(Viewv){CharSequencecharSequence=(CharSequence)iv_drag.getTag();ClipData.Itemitem=newClipData.Item(charSequence);ClipDataclipData=newClipData(charSequence,newString[]{ClipDescription.MIMETYPE_TEXT_PLAIN},item);View.DragShadowBuildershadowBuilder=newView.DragShadowBuilder(iv_drag);if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){iv_drag.startDragAndDrop(clipData,shadowBuilder,null,0);}else{iv_drag.startDrag(clipData,shadowBuilder,null,0);}returntrue;}});3.3 方框接收图片
目标View要接收图片需要先调用setOnDragListener()来接受拖放事件的回调,使用event.getAction()来获取不同的拖放事件类型,然后根据事件类型执行相应的操作,示例如下:
ll_accept.setOnDragListener(newView.OnDragListener(){@OverridepublicbooleanonDrag(Viewv,DragEventevent){switch(event.getAction()){caseDragEvent.ACTION_DRAG_STARTED:iv_drag.setVisibility(View.GONE);if(event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)){returntrue;}returnfalse;caseDragEvent.ACTION_DRAG_ENTERED:isChangePos=true;ll_accept.setBackgroundResource(R.drawable.green_bac);returntrue;caseDragEvent.ACTION_DRAG_LOCATION:x=event.getX();y=event.getY();returntrue;caseDragEvent.ACTION_DRAG_EXITED:isChangePos=false;ll_accept.setBackgroundResource(R.drawable.black_bac);returntrue;caseDragEvent.ACTION_DROP:returntrue;caseDragEvent.ACTION_DRAG_ENDED:ll_accept.setBackgroundResource(R.drawable.black_bac);if(isChangePos&&event.getResult()){intleft=ll_accept.getLeft();inttop=ll_accept.getTop();x=x+left-(iv_drag.getWidth()/2);y=y+top-(iv_drag.getHeight()/2);iv_drag.setX(x);iv_drag.setY(y);}iv_drag.setVisibility(View.VISIBLE);returntrue;}returnfalse;}});
到此,关于“Android中怎么为View添加拖放效果”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。