在Android中拖放多个布局的自动滚动

时间:2013-04-23 11:34:39

标签: android drag-and-drop android-scrollview

“当我拖放具有多个布局的图像时,”自动滚动效果不佳“

我搜遍了所有,但找不到解决方案。 我从这个链接得到了一个解决方案:

Make a scrollView autoscroll with drag and drop in Android

@thehayro感谢这样一个很好的例子。

但它只适用于一个布局,并且自动滚动也可以使用。但我在一个线性布局中有超过4-5个子布局,这个布局在滚动视图中我的布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<com.example.dragvdropdemo.MyScrollView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/scroll_view">
<LinearLayout 
 android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:id="@+id/lldrag">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="200dip" 
    android:id="@+id/ll1"
    android:layout_marginTop="10dip"
     android:background="@android:color/darker_gray">

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/dr_logo" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/imageView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/fb" />

</LinearLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="200dip" 
    android:id="@+id/ll2"
    android:layout_marginTop="10dip"
    android:background="@android:color/darker_gray">


    <ImageView
        android:id="@+id/ImageView01"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/twitter" />

    <ImageView
        android:id="@+id/ImageView02"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/ImageView03"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="200dip" 
    android:id="@+id/ll3"
    android:layout_marginTop="10dip"
     android:background="@android:color/darker_gray">


    <ImageView
        android:id="@+id/ImageView1_l3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/twitter" />

    <ImageView
        android:id="@+id/ImageView2_l3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/ImageView3_l3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="200dip" 
    android:id="@+id/ll4"
    android:layout_marginTop="10dip"
     android:background="@android:color/darker_gray">


    <ImageView
        android:id="@+id/ImageView1_l4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/twitter" />

    <ImageView
        android:id="@+id/ImageView2_l4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />

    <ImageView
        android:id="@+id/ImageView3_l4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/ic_launcher" />
</LinearLayout>
</LinearLayout>
 </com.example.dragvdropdemo.MyScrollView>

我想将图像从一个拖放到另一个布局。我不知道如何解决它。我试过但我能做到。我不知道我的代码是:

public class MyActivity extends Activity {


ImageView   img1,img2,img3,img01;
ImageView img02,img03,img1_l3,img2_l3,img3_l3,img1_l4,img2_l4,img3_l4;
LinearLayout ll1,ll2,ll3,ll4,lldrag;

MyScrollView myScrollView;
int mScrollDistance;

private static int oldvalue;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mylist);

    //SCROLLVIEW
       myScrollView = (MyScrollView) findViewById(R.id.scroll_view);
         myScrollView.setOnScrollViewListener(new         MyScrollView.OnScrollViewListener() {

            @Override
            public void onScrollChanged1(OnScrollViewListener listener) {
                // TODO Auto-generated method stub
                mScrollDistance = myScrollView.getScrollY();
            }
        });

    img1 = (ImageView)findViewById(R.id.imageView1);
    img2 = (ImageView)findViewById(R.id.imageView2);
    img3 = (ImageView)findViewById(R.id.imageView3);
    img01 = (ImageView)findViewById(R.id.ImageView01);
    img02 = (ImageView)findViewById(R.id.ImageView02);
    img03 = (ImageView)findViewById(R.id.ImageView03);
    img1_l3 = (ImageView)findViewById(R.id.ImageView1_l3);
    img2_l3 = (ImageView)findViewById(R.id.ImageView2_l3);
    img3_l3 = (ImageView)findViewById(R.id.ImageView3_l3);
    img1_l4 = (ImageView)findViewById(R.id.ImageView1_l4);
    img2_l4 = (ImageView)findViewById(R.id.ImageView2_l4);
    img3_l4 = (ImageView)findViewById(R.id.ImageView3_l4);
    ll1 = (LinearLayout)findViewById(R.id.ll1);
    ll2 = (LinearLayout)findViewById(R.id.ll2);
    ll3 = (LinearLayout)findViewById(R.id.ll3);
    ll4 = (LinearLayout)findViewById(R.id.ll4);
    lldrag = (LinearLayout)findViewById(R.id.lldrag);

    img1.setOnTouchListener(new ChoiceTouchListener());
    img2.setOnTouchListener(new ChoiceTouchListener());
    img3.setOnTouchListener(new ChoiceTouchListener());
    img01.setOnTouchListener(new ChoiceTouchListener());
    img02.setOnTouchListener(new ChoiceTouchListener());
    img03.setOnTouchListener(new ChoiceTouchListener());
    img1_l3.setOnTouchListener(new ChoiceTouchListener());
    img2_l3.setOnTouchListener(new ChoiceTouchListener());
    img3_l3.setOnTouchListener(new ChoiceTouchListener());
    img1_l4.setOnTouchListener(new ChoiceTouchListener());
    img2_l4.setOnTouchListener(new ChoiceTouchListener());
    img3_l4.setOnTouchListener(new ChoiceTouchListener());

    ll1.setOnDragListener(new ChoiceDragListener());
    ll2.setOnDragListener(new ChoiceDragListener());
    ll3.setOnDragListener(new ChoiceDragListener());
    ll4.setOnDragListener(new ChoiceDragListener());
    lldrag.setOnDragListener(new ChoiceDragListener());


}

private final class ChoiceTouchListener implements OnTouchListener {

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        // TODO Auto-generated method stub


        ClipData data=ClipData.newPlainText("", "");
        DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(view);
        //start dragging the item touched''
        view.startDrag(data, shadowBuilder, view, 0);
        return true;
    } 
} 

/**
 * DragListener will handle dragged views being dropped on the drop area
 * - only the drop action will have processing added to it as we are not
 * - amending the default behavior for other parts of the drag process
 *
 */
class ChoiceDragListener implements OnDragListener {



    @Override
    public boolean onDrag(View v, DragEvent event) {
        switch (event.getAction()) {
        case DragEvent.ACTION_DRAG_STARTED:
            //no action necessary
            Log.i("", "DRAGSTARTED");
            break;
        case DragEvent.ACTION_DRAG_ENTERED:
            //no action necessary
            Log.i("","DRAGENTERED");
            break;
        case DragEvent.ACTION_DRAG_EXITED:        
            //no action necessary
            Log.i("","DRAGEXITED");
            break;
        case DragEvent.ACTION_DROP:
            //handle the dragged view being dropped over a drop view
            Log.i("","DROP");
            View view = (View) event.getLocalState();

            LinearLayout ll=(LinearLayout) view.getParent();
            ll.removeView(view);
            LinearLayout dropTarget = (LinearLayout) v;
            ImageView dropped = (ImageView) view;

            dropTarget.addView(dropped,0);

            Object tag = dropTarget.getTag();

            if(tag!=null)
            {

                int existingID = (Integer)tag;

                findViewById(existingID).setVisibility(View.VISIBLE);
            }
            //set the tag in the target view being dropped on - to the ID of the view being dropped
            dropTarget.setTag(dropped.getId());
            break;

        case DragEvent.ACTION_DRAG_LOCATION:
            //no action necessary
            int y = Math.round(event.getY());
              int translatedY = y - mScrollDistance;
              Log.i("translated",""+translatedY+" "+ mScrollDistance+" "+y);
              int threshold =50 ;
              // make a scrolling up due the y has passed the threshold
              if (translatedY < threshold) {
                 // make a scroll up by 30 px
                 myScrollView.scrollBy(0, -30);
              }
              // make a autoscrolling down due y has passed the 500 px border
              if (translatedY + threshold > 200) {
                 // make a scroll down by 30 px
                 myScrollView.scrollBy(0, 30);
              }
            break;

        case DragEvent.ACTION_DRAG_ENDED:
            //no action necessary
            break;
        default:
            break;
        }
        return true;
    }

} 
}

MySrollView

public class MyScrollView  extends ScrollView {

public OnScrollViewListener mListener;

public MyScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
}

@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
    // TODO Auto-generated method stub
    super.onScrollChanged(l, t, oldl, oldt);
    if (mListener != null) {
         mListener.onScrollChanged1(mListener);
     }
}

public void setOnScrollViewListener(OnScrollViewListener listener) {
    mListener = listener;
}
public static interface OnScrollViewListener {
       public void onScrollChanged1(OnScrollViewListener listener);
    }
}
我是初学者,所以不太了解所以请告诉我如何解决它。 对不起我的英语和语法错误。 谢谢你的进步

1 个答案:

答案 0 :(得分:4)

嘿伙计们,我自己已经解决了这个问题。这就是解决方案......

               DragEvent.ACTION_DRAG_LOCATION:
        //no action necessary
          int y = Math.round(v.getY())+Math.round(event.getY());
              int translatedY = y - mScrollDistance;
              Log.i("translated",""+translatedY+" "+ mScrollDistance+" "+y);
              int threshold =50 ;
              // make a scrolling up due the y has passed the threshold
              if (translatedY < 200) {
                 // make a scroll up by 30 px
                 myScrollView.smoothScrollBy(0, -15);
              }
              // make a autoscrolling down due y has passed the 500 px border
              if (translatedY + threshold > 500) {
                 // make a scroll down by 30 px
                 myScrollView.smoothScrollBy(0, 15);
              }

            break;