博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Android】HorizontalScrollView内子控件横向拖拽
阅读量:6961 次
发布时间:2019-06-27

本文共 3329 字,大约阅读时间需要 11 分钟。

截图

   

代码

java

public 
class HoDragActivity 
extends Activity {
    
private LinearLayout main;
    
private GestureDetector mGestureDetector;
    @Override
    
public 
void onCreate(Bundle savedInstanceState) {
        
super.onCreate(savedInstanceState);
        setContentView(R.layout.main_cc);
        main = (LinearLayout) findViewById(R.id.main);
        bindDrapListener(R.id.myimage1);
        bindDrapListener(R.id.myimage2);
        bindDrapListener(R.id.myimage3);
        bindDrapListener(R.id.myimage4);
        bindDrapListener(R.id.myimage5);
        bindDrapListener(R.id.myimage6);
        bindDrapListener(R.id.myimage7);
        bindDrapListener(R.id.myimage8);
        bindDrapListener(R.id.myimage9);
        bindDrapListener(R.id.myimage10);
        bindDrapListener(R.id.myimage11);
        bindDrapListener(R.id.myimage12);
        mGestureDetector = 
new GestureDetector(
this
new DrapGestureListener());
    }
    
private View mDrapView;
    
private 
void bindDrapListener(
int id) {
        View v = findViewById(id);
        v.setOnTouchListener(mOnTouchListener);
        v.setOnDragListener(mOnDragListener);
    }
    
private OnTouchListener mOnTouchListener = 
new OnTouchListener() {
        @Override
        
public 
boolean onTouch(View v, MotionEvent event) {
            mDrapView = v;
            
if (mGestureDetector.onTouchEvent(event))
                
return 
true;
            
switch (event.getAction() & MotionEvent.ACTION_MASK) {
            
case MotionEvent.ACTION_UP:
                
break;
            }
            
return 
false;
        }
    };
    
private OnDragListener mOnDragListener = 
new OnDragListener() {
        @Override
        
public 
boolean onDrag(View v, DragEvent event) {
            
switch (event.getAction()) {
            
case DragEvent.ACTION_DRAG_STARTED:
                
//
 Do nothing
                
break;
            
case DragEvent.ACTION_DRAG_ENTERED:
                v.setAlpha(0.5F);
                
break;
            
case DragEvent.ACTION_DRAG_EXITED:
                v.setAlpha(1F);
                
break;
            
case DragEvent.ACTION_DROP:
                View view = (View) event.getLocalState();
                
for (
int i = 0, j = main.getChildCount(); i < j; i++) {
                    
if (main.getChildAt(i) == v) {
                        
//
 当前位置
                        main.removeView(view);
                        main.addView(view, i);
                        
break;
                    }
                }
                
break;
            
case DragEvent.ACTION_DRAG_ENDED:
                v.setAlpha(1F);
            
default:
                
break;
            }
            
return 
true;
        }
    };
    
private 
class DrapGestureListener 
extends SimpleOnGestureListener {
        @Override
        
public 
boolean onSingleTapConfirmed(MotionEvent e) {
            
return 
super.onSingleTapConfirmed(e);
        }
        @Override
        
public 
void onLongPress(MotionEvent e) {
            
super.onLongPress(e);
            ClipData data = ClipData.newPlainText("", "");
            MyDragShadowBuilder shadowBuilder = 
new MyDragShadowBuilder(
                    mDrapView);
            mDrapView.startDrag(data, shadowBuilder, mDrapView, 0);
        }
        @Override
        
public 
boolean onDown(MotionEvent e) {
            
return 
true;
        }
    }
    
private 
class MyDragShadowBuilder 
extends View.DragShadowBuilder {
        
private 
final WeakReference<View> mView;
        
public MyDragShadowBuilder(View view) {
            
super(view);
            mView = 
new WeakReference<View>(view);
        }
        @Override
        
public 
void onDrawShadow(Canvas canvas) {
            canvas.scale(1.5F, 1.5F);
            
super.onDrawShadow(canvas);
        }
        @Override
        
public 
void onProvideShadowMetrics(Point shadowSize,
                Point shadowTouchPoint) {
            
//
 super.onProvideShadowMetrics(shadowSize, shadowTouchPoint);
            
final View view = mView.get();
            
if (view != 
null) {
                shadowSize.set((
int) (view.getWidth() * 1.5F),
                        (
int) (view.getHeight() * 1.5F));
                shadowTouchPoint.set(shadowSize.x / 2, shadowSize.y / 2);
            } 
else {
                
//
 Log.e(View.VIEW_LOG_TAG,
                
//
 "Asked for drag thumb metrics but no view");
            }
        }
    }
}

代码说明

1、 MyDragShadowBuilder主要用于缩放拖拽的ImageView,这里放大了1.5倍,而又不至于影响原控件,这里是放大两倍

2、这里是通过长按来唤起拖拽操作,所以监听了onLongPress

3、注意拖拽onDragListener是Android 3.0才新增的API

文章

 

 

下载

 

本文转自博客园农民伯伯的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
LRSlidingTableViewCell
查看>>
FlipCardNavigationView
查看>>
【系统日志笔记二】——撸起袖子写个自定义日志注解
查看>>
完全平衡树的简单实现(Scala)
查看>>
HttpServlet详解
查看>>
无线网络
查看>>
架构设计:生产者/消费者模式 第4页:注意事项
查看>>
1233
查看>>
php写入文件权限失败 file_put_contents: failed to open stream: Permission denied
查看>>
MarMoible的 java4android视频
查看>>
我想象的创业团队
查看>>
Android 自定义控件实现点击波浪效果(九)
查看>>
MySQL单列索引和组合索引的区别介绍
查看>>
Git命令
查看>>
aws S3 util demo
查看>>
react native ios 网络请求问题
查看>>
python文件处理
查看>>
Oracle高级应用之物化视图(materialized view)
查看>>
自定义文件上传样式,该方法几乎可以覆盖其他一切浏览原生样式
查看>>
图片上传后即时预览
查看>>