zoukankan      html  css  js  c++  java
  • 【Android】HorizontalScrollView内子控件横向拖拽


    前言

    网上ListView上下拖动的例子有,效果也很好,但是项目要横着拖的,只要硬着头皮自己写(主要是没找到合适的),参考文章1修改而来,分享一下。


    声明

    欢迎转载,但请保留文章原始出处:) 
    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com


    正文

    截图

       

    代码

    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(thisnew 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

    文章

    Android Drag and Drop - Tutorial 

    Android开发者指南-用户界面-拖放-Drag and Drop 

    下载

     VogellaDraganddrop.zip

    结束

    欢迎交流!想做成拖动插入时自动两边挤开的效果,没弄出来,出来是抖动的效果。 

  • 相关阅读:
    【连载】Bootstrap开发漂亮的前端界面之插件开发
    【连载】Bootstrap开发漂亮的前端界面之自定义右键菜单
    Bootstrap开发漂亮的前端界面之实现原理
    终于有SpringMvc与Struts2的对比啦
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【G】开源的分布式部署解决方案文档
    【轮子狂魔】手把手教你用JS给博客动态增加目录
    【G】系列导航
  • 原文地址:https://www.cnblogs.com/over140/p/3599319.html
Copyright © 2011-2022 走看看