【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

 

结束

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于动态加载数据并实现横向滑动效果的 HorizontalScrollView,你可以按照以下步骤进行操作: 1. 在你的布局文件中添加 HorizontalScrollView 件: ```xml <HorizontalScrollView android:id="@+id/horizontalScrollView" android:layout_width="match_parent" android:layout_height="wrap_content"> <LinearLayout android:id="@+id/linearLayout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <!-- 这里可以动态添加视图 --> </LinearLayout> </HorizontalScrollView> ``` 2. 在你的代码中获取 HorizontalScrollView 和 LinearLayout 对象,并根据数据动态添加视图: ```java HorizontalScrollView horizontalScrollView = findViewById(R.id.horizontalScrollView); LinearLayout linearLayout = findViewById(R.id.linearLayout); for (int i = 0; i < 数据集合.size(); i++) { final 数据类型 数据 = 数据集合.get(i); // 创建视图 TextView textView = new TextView(this); textView.setText(数据.文本); textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 处理单项点击事件 // 这里可以根据需要执行相应的操作 } }); // 将视图添加到 LinearLayout linearLayout.addView(textView); } ``` 3. 如果你希望每次只能选择一项,你可以在点击事件中记录当前选中的项,并在下次点击时取消上一次的选中效果: ```java private TextView lastSelectedView; // ... textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (lastSelectedView != null) { // 取消上一次选中的效果 lastSelectedView.setSelected(false); } // 设置当前选中的效果 textView.setSelected(true); lastSelectedView = textView; // 处理单项点击事件 // 这里可以根据需要执行相应的操作 } }); ``` 这样,你就可以实现在 HorizontalScrollView 中动态加载数据,并且只能单项点击的效果了。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值