Android View 拖动
来源:互联网 发布:大数据 传统零售业 编辑:程序博客网 时间:2024/06/05 20:54
Android View 拖动&插入 研究
View 拖动&插入
即: 支持 拖动图标 然后把之插入 2个View 之间
为了降低难度 选用了若干ImageView 放入ViewGroup : vertical LinearLayout
[代码 步骤]
1. 定义布局:main.xml :
Xml代码
< ?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns: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>
< ?xml version="1.0" encoding="utf-8"?>
< LinearLayout xmlns: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 = new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch(action){
//鼠标按下 拖拉动作开始
case MotionEvent.ACTION_DOWN:
point1 = v.getTop();
startX = (int)event.getX();
startY = y - v.getTop();
break;
//鼠标移动 拖拉动作进行中
case MotionEvent.ACTION_MOVE:
v.layout(x - startX, y - startY, x + v.getWidth()
- startX, y - startY + v.getHeight());
v.bringToFront();
v.postInvalidate();
break;
//鼠标释放 拖拉动作结束
case MotionEvent.ACTION_UP:
point2 = v.getTop();
//计算插入位置 位于哪两个相邻View之间
int dest = getLocation(v);
//remove ori view, and then add view here
lLayout.removeView(v);
lLayout.addView(v, dest);
break;
}
return false;
}
};
//to listener all ImageView
for(int i=0;i< p>
ImageView iv = (ImageView)lLayout.getChildAt(i);
接上页
if(iv !=null){
iv.setOnTouchListener(touchListener);
}
else {
//error, view is null!
}
}
touchListener = new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
int action = event.getAction();
int x = (int) event.getRawX();
int y = (int) event.getRawY();
switch(action){
//鼠标按下 拖拉动作开始
case MotionEvent.ACTION_DOWN:
point1 = v.getTop();
startX = (int)event.getX();
startY = y - v.getTop();
break;
//鼠标移动 拖拉动作进行中
case MotionEvent.ACTION_MOVE:
v.layout(x - startX, y - startY, x + v.getWidth()
- startX, y - startY + v.getHeight());
v.bringToFront();
v.postInvalidate();
break;
//鼠标释放 拖拉动作结束
case MotionEvent.ACTION_UP:
point2 = v.getTop();
//计算插入位置 位于哪两个相邻View之间
int dest = getLocation(v);
//remove ori view, and then add view here
lLayout.removeView(v);
lLayout.addView(v, dest);
break;
}
return false;
}
};
//to listener all ImageView
for(int i=0;i< p>
ImageView iv = (ImageView)lLayout.getChildAt(i);
if(iv !=null){
iv.setOnTouchListener(touchListener);
}
else {
//error, view is null!
}
}
4. getLocation(View) 用于: 根据目标View 判断待插入的位置 即:哪2个相邻ImageView 之间 实现为:
Java代码
public int getLocation(View v){
for(int i=0;i< p>
接上页
ImageView iv = (ImageView)lLayout.getChildAt(i);
ImageView iv2 = (ImageView)lLayout.getChildAt(i+1);
if(iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){
//refer delta of point1 & point2
if(point1 < point2){//drag to bottom
return i+1;
}
else {//drag to up
return i+1;
}
}
}
//otherwise return last location
return lLayout.getChildCount()-1;
}
public int getLocation(View v){
for(int i=0;i< p>
ImageView iv = (ImageView)lLayout.getChildAt(i);
ImageView iv2 = (ImageView)lLayout.getChildAt(i+1);
if(iv.getTop()< v.getTop() && iv2.getTop() > v.getTop()){
//refer delta of point1 & point2
if(point1 < point2){//drag to bottom
return i+1;
}
else {//drag to up
return i+1;
}
}
}
//otherwise return last location
return lLayout.getChildCount()-1;
}
5. emulator
运行截图:
- 拖拉前:
- 拖拉后:
- Android View 拖动
- Android View的拖动
- Android View 拖动效果
- Android View 拖动&插入
- [Android-Demo]Android View的拖动
- Android-可随意拖动的View
- 【Android】自定义view-拖动小球移动
- Android view手势拖动和缩放
- Android仿mac音量拖动view实现
- Android实现View的任意拖动
- Android开发 自定义悬浮可拖动view
- Android 可在全屏幕自由拖动的view
- Android可在全屏幕自由拖动的view
- android开发自定义View,可以自由拖动的控件
- Android——滚动效果(View内部滚动+拖动滚动)
- Android 自定义View——拖动选择时间控件
- Android用属性动画拖动view到任意位置
- Android View拖动至任意位置(ImageView,VideoView等)
- GAE启动错误 GoogleAppEngineLauncher.py", line 42...解决方案
- 超级电容的容值计算
- Svn修改日志
- 使用Dbms_Redefinition转换普通表-》分区表
- 简单使用ODBC测试数据源
- Android View 拖动
- c#索引器
- C# 类中索引器的使用
- 怎样去掉VC中的空文档
- C# 类中索引器的使用
- Type Casting
- uva 539 - The Settlers of Catan
- C++ primer习题3.14
- 人工智能