Drag & Drop-Auto-Scroll mit mehreren Layouts in Android

"Auto-Scroll funktioniert nicht sehr gut, wenn ich das Bild mit mehreren Layouts ziehe und ablege"

Ich habe überall gesucht, aber keine Lösung gefunden. Ich habe eine Lösung von diesem Link:

Erstellen Sie mit Drag & Drop in Android einen ScrollView-Autoscroll

@thehayro danke für so ein schönes Beispiel.

Es funktioniert jedoch nur für ein Layout, und der automatische Bildlauf wird ebenfalls ausgeführt. Aber ich habe mehr als 4-5 untergeordnete Layouts in einem linearen Layout und dieses Layout befindet sich in der Bildlaufansicht. Meine Layoutdatei sieht folgendermaßen aus:

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

Ich möchte ein Bild per Drag & Drop in ein anderes Layout ziehen. Ich weiß nicht, wie ich es lösen soll. Ich habe es versucht, aber ich könnte es tun. Ich weiß nicht genau, und mein Code lautet:

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);
    }
}

Ich bin Android-Anfänger, weiß es also nicht so genau, also sag mir, wie ich es lösen soll. Entschuldigung für meinen schlechten Englisch- und Grammerfehler. Vielen Dank im Voraus

Antworten auf die Frage(1)

Ihre Antwort auf die Frage