Android(安卓)View 拖动
AndroidView拖动&插入研究 |
|
View拖动&插入 即:支持拖动图标然后把之插入2个View之间 为了降低难度选用了若干ImageView放入ViewGroup:verticalLinearLayout [代码步骤] 1.定义布局:main.xml: Xml代码 <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/linear" > <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing1_b"/> <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing2_b"/> <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing3_b"/> <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing3_b"/> </LinearLayout> <?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/linear" > <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing1_b"/> <ImageButton android:layout_width="100dip" android:layout_height="100dip" android:src="@drawable/beijing2_b"/> <ImageButton android:layout_width="100dip" |
接上页
android:layout_height="100dip"
android:src="@drawable/beijing3_b"/>
<ImageButton
android:layout_width="100dip"
android:layout_height="100dip"
android:src="@drawable/beijing3_b"/>
</LinearLayout>
2.变量初始化
Java代码
lLayout=(LinearLayout)findViewById(R.id.linear);
lLayout=(LinearLayout)findViewById(R.id.linear);
3.定义OnTouchListener用于监听所有动作并注册LinearLayour的所有View实现为:
Java代码
touchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
//TODOAuto-generatedmethodstub
intaction=event.getAction();
intx=(int)event.getRawX();
inty=(int)event.getRawY();
switch(action){
//鼠标按下拖拉动作开始
caseMotionEvent.ACTION_DOWN:
point1=v.getTop();
startX=(int)event.getX();
startY=y-v.getTop();
break;
//鼠标移动拖拉动作进行中
caseMotionEvent.ACTION_MOVE:
v.layout(x-startX,y-startY,x+v.getWidth()
-startX,y-startY+v.getHeight());
v.bringToFront();
v.postInvalidate();
break;
//鼠标释放拖拉动作结束
caseMotionEvent.ACTION_UP:
point2=v.getTop();
//计算插入位置位于哪两个相邻View之间
intdest=getLocation(v);
//removeoriview,andthenaddviewhere
lLayout.removeView(v);
lLayout.addView(v,dest);
break;
}
returnfalse;
}
};
//tolistenerallImageView
for(inti=0;i<p>
ImageViewiv=(ImageView)lLayout.getChildAt(i);
接上页
if(iv!=null){
iv.setOnTouchListener(touchListener);
}
else{
//error,viewisnull!
}
}
touchListener=newOnTouchListener(){
@Override
publicbooleanonTouch(Viewv,MotionEventevent){
//TODOAuto-generatedmethodstub
intaction=event.getAction();
intx=(int)event.getRawX();
inty=(int)event.getRawY();
switch(action){
//鼠标按下拖拉动作开始
caseMotionEvent.ACTION_DOWN:
point1=v.getTop();
startX=(int)event.getX();
startY=y-v.getTop();
break;
//鼠标移动拖拉动作进行中
caseMotionEvent.ACTION_MOVE:
v.layout(x-startX,y-startY,x+v.getWidth()
-startX,y-startY+v.getHeight());
v.bringToFront();
v.postInvalidate();
break;
//鼠标释放拖拉动作结束
caseMotionEvent.ACTION_UP:
point2=v.getTop();
//计算插入位置位于哪两个相邻View之间
intdest=getLocation(v);
//removeoriview,andthenaddviewhere
lLayout.removeView(v);
lLayout.addView(v,dest);
break;
}
returnfalse;
}
};
//tolistenerallImageView
for(inti=0;i<p>
ImageViewiv=(ImageView)lLayout.getChildAt(i);
if(iv!=null){
iv.setOnTouchListener(touchListener);
}
else{
//error,viewisnull!
}
}
4.getLocation(View)用于:根据目标View判断待插入的位置即:哪2个相邻ImageView之间实现为:
Java代码
publicintgetLocation(Viewv){
for(inti=0;i<p>
接上页
ImageViewiv=(ImageView)lLayout.getChildAt(i);
ImageViewiv2=(ImageView)lLayout.getChildAt(i+1);
if(iv.getTop()<v.getTop()&&iv2.getTop()>v.getTop()){
//referdeltaofpoint1&point2
if(point1<point2){//dragtobottom
returni+1;
}
else{//dragtoup
returni+1;
}
}
}
//otherwisereturnlastlocation
returnlLayout.getChildCount()-1;
}
publicintgetLocation(Viewv){
for(inti=0;i<p>
ImageViewiv=(ImageView)lLayout.getChildAt(i);
ImageViewiv2=(ImageView)lLayout.getChildAt(i+1);
if(iv.getTop()<v.getTop()&&iv2.getTop()>v.getTop()){
//referdeltaofpoint1&point2
if(point1<point2){//dragtobottom
returni+1;
}
else{//dragtoup
returni+1;
}
}
}
//otherwisereturnlastlocation
returnlLayout.getChildCount()-1;
}
5.emulator
运行截图:
-拖拉前:
-拖拉后:
更多相关文章
- Android中BroadcastReceiver(异步接收广播Intent)的使用
- Java,Android内存泄漏代码片段
- Android(安卓)本地代码中的LIKELY和UNLIKELY宏
- Android学习笔记(十七)——使用意图调用内置应用程序
- android 播放器合集打包(源码来源网络)
- android TextView实现自动滚动和Java中改变显示内容
- Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码
- android 10.0 以上隐藏方法无法调用 #Accessing hidden method
- AndroidStudio配置使用lambda