Android HorizontalScrollView内子控件横向拖拽实例代码

前言

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

正文

截图

实现代码:

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。

以上就是Android HorizontalScrollView内子控件横向拖拽实例,欢迎交流,有需要参考下。

(0)

相关推荐

  • Android UI系列-----ScrollView和HorizontalScrollView的详解

    本篇随笔将讲解一下Android当中比较常用的两个布局容器--ScrollView和HorizontalScrollView,从字面意义上来看也是非常的简单的,ScrollView就是一个可以滚动的View,这个滚动的方向是垂直方向的,而HorizontalScrollView则是一个水平方向的可以滚动的View.本篇随笔可能描述性的知识比较少,最主要还是通过代码来看看如何使用这两个View. 一.ScrollView的简单介绍 首先来看看ScrollView和HorizontalScrollV

  • Android使用自定义控件HorizontalScrollView打造史上最简单的侧滑菜单

    侧滑菜单在很多应用中都会见到,最近QQ5.0侧滑还玩了点花样~~对于侧滑菜单,一般大家都会自定义ViewGroup,然后隐藏菜单栏,当手指滑动时,通过Scroller或者不断的改变leftMargin等实现:多少都有点复杂,完成以后还需要对滑动冲突等进行处理~~今天给大家带来一个简单的实现,史上最简单有点夸张,但是的确是我目前遇到过的最简单的一种实现~~~ 1.原理分析 既然是侧滑,无非就是在巴掌大的屏幕,塞入大概两巴掌大的布局,需要滑动可以出现另一个,既然这样,大家为啥不考虑使用Android

  • Android利用HorizontalScrollView仿ViewPager设计简单相册

    最近学习了一个视频公开课,讲到了利用HorizontalScrollView仿ViewPager设计的一个简单相册,其实主要用了ViewPager缓存的思想.此篇文章参考:Android自定义HorizontalScrollView打造超强Gallery效果(这篇文章与公开课的讲的大致一样) 这里简单说一下ViewPager的缓存机制 1.进入ViewPager时,加载当前页和后一页: 2.当滑动ViewPager至下一页时,加载后一页,此时第一页是不会销毁的,同时加载当前页的下一页. 其实就是

  • android listview 水平滚动和垂直滚动的小例子

    网上有很多解决 android listview 水平和垂直滚动的代码,我没有按照他们说的做(以前没搜到 O(∩_∩)O~) 我采用的是添加HorizontalScrollViewJava代码 复制代码 代码如下: < ScrollView android:id="@+id/ScrollView01" android:layout_height="300px" android:layout_x="16px" android:layout_y

  • Android自定义HorizontalScrollView打造超强Gallery效果

    自从Gallery被谷歌废弃以后,Google推荐使用ViewPager和HorizontalScrollView来实现Gallery的效果.的确HorizontalScrollView可以实现Gallery的效果,但是HorizontalScrollView存在一个很大的问题,如果你仅是用来展示少量的图片,应该是没问题的,但是如果我希望HorizontalScrollView可以想ViewPager一样,既可以绑定数据集(动态改变图片),还能做到,不管多少图片都不会OOM(ViewPager内

  • HorizontalScrollView水平滚动控件使用方法详解

    一.简介 用法ScrollView大致相同 二.方法 1)HorizontalScrollView水平滚动控件使用方法 1.在layout布局文件的最外层建立一个HorizontalScrollView控件 2.在HorizontalScrollView控件中加入一个LinearLayout控件,并且把它的orientation设置为horizontal 3.在LinearLayout控件中放入多个装有图片的ImageView控件 2)HorizontalScrollView和ScrollVie

  • Android中HorizontalScrollView使用方法详解

    由于移动设备物理显示空间一般有限,不可能一次性的把所有要显示的内容都显示在屏幕上.所以各大平台一般会提供一些可滚动的视图来向用户展示数据.Android平台框架中为我们提供了诸如ListView.GirdView.ScrollView等滚动视图控件,这几个视图控件也是我们平常使用最多的.下面介绍一下HorizontalScrollView的使用和需要注意的点:  HorizontalScrollView是一个FrameLayout  ,这意味着你只能在它下面放置一个子控件,这个子控件可以包含很多

  • Android自定义HorizontalScrollView实现qq侧滑菜单

    今天看了鸿洋_大神在慕课网讲的qq5.0侧滑菜单.学了不少的知识,同时也佩服鸿洋_大神思路的清晰. 看了教程课下也自己实现了一下.代码几乎完全相同  别喷我啊..没办法 o(︶︿︶)o 唉 像素不好 没办法 找不到好的制作gif的软件. 我们暂且称侧滑左边界面的为menu,右边为content 首先是menu的布局 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:androi

  • Android中实现多行、水平滚动的分页的Gridview实例源码

    功能要求: (1)比如每页显示2X2,总共2XN,每个item显示图片+文字(点击有链接). 如果单行水平滚动,可以用Horizontalscrollview实现. 如果是多行水平滚动,则结合Gridview(一般是垂直滚动的)和Horizontalscrollview实现. (2)水平滚动翻页,下面有显示当前页的icon. 1.实现自定义的HorizontalScrollView(HorizontalScrollView.java): 因为要翻页时需要传当前页给调用者,所以fling函数中自己

  • Android HorizontalScrollView左右滑动效果

    本文实例为大家分享了Android HorizontalScrollView左右滑动的具体代码,供大家参考,具体内容如下 效果图 一.什么是HorizontalScrollView HorizontalScrollView实际上是一个FrameLayout ,这意味着你只能在它下面放置一个子控件 ,这个子控件可以包含很多数据内容.有可能这个子控件本身就是一个布局控件,可以包含非常多的其他用来展示数据的控件.这个布局控件一般使用的是一个水平布局的LinearLayout.TextView也是一个可

随机推荐