生放送ソフトのソースコードAndroidの複数のImageViewドラッグアンドドロップ交換画像


あまり話さないで直接コードをつけます.
まずXMLファイルコードです.
<LinearLayout                    
 android:layout_width="match_parent"                    
 android:layout_height="match_parent"
 android:orientation="horizontal"      >
                <LinearLayout
                    android:id="@+id/release_img0_layout"
                    android:layout_width="0px"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20px"
                    android:layout_weight="1">
 
                    <ImageView
                        android:id="@+id/release_img0"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:scaleType="centerCrop" />
 
                </LinearLayout>
 
                <LinearLayout
                    android:id="@+id/release_img1_layout"
                    android:layout_width="0px"
                    android:layout_height="match_parent"
                    android:layout_marginLeft="20px"
                    android:layout_weight="1">
 
                    <ImageView
                        android:id="@+id/release_img1"
                        android:layout_width="match_parent"
                        android:layout_height="match_parent"
                        android:scaleType="centerCrop" />
 
                </LinearLayout>
 </LinearLayout>

ポイントは、2つのImageViewはそれぞれLayoutで単独で装着し、後で理由を説明します.
次に、初期化を行います.
 mImg0 = findViewById(R.id.release_img0);
 mImg1 = findViewById(R.id.release_img1);
mImg0_layout = findViewById(R.id.release_img0_layout);
mImg1_layout = findViewById(R.id.release_img1_layout);
//  ImageView                
 mImg0.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg0_layout.setOnDragListener(ImgUtils.MyDragListener);
 mImg1.setOnTouchListener(ImgUtils.MyTouchEvent);
 mImg1_layout.setOnDragListener(ImgUtils.MyDragListener);

リスニングの詳細:
public class ImgUtils {
    private static long lastTime;
    public static View.OnTouchListener MyTouchEvent = new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (event.getAction() == MotionEvent.ACTION_DOWN) {
                LogUtils.loge("ACTION_DOWN");
                long lastTime1 = System.currentTimeMillis();
 
                lastTime=lastTime1;
                ClipData data = ClipData.newPlainText("", "");
                View.DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
                v.startDrag(data, shadowBuilder, v, 0);
                if ((lastTime1-lastTime)<200){
                    v.setAlpha((float) 1.0);
                    return false;
                }
                v.setAlpha((float) 0.5);
            } else if (event.getAction() == MotionEvent.ACTION_UP){
                LogUtils.loge("ACTION_UP");
                long time = System.currentTimeMillis();
                if ((time - lastTime)<500){ //     500  ,      
                    return false;
                }
            }else if (event.getAction() == MotionEvent.ACTION_MOVE){
                LogUtils.loge("ACTION_MOVE");
            }
 
            return false;
 
        }
    };
 
    public static View.OnDragListener MyDragListener = new View.OnDragListener() {
 
        @RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
        @Override
        public boolean onDrag(View v, DragEvent event) {
            View visitorView = (View) event.getLocalState();
            if (visitorView == null) return true;
            ViewGroup visitorOwner = (ViewGroup) visitorView.getParent();
            ViewGroup visitedOwner = (ViewGroup) v;
            View visitedImage = visitedOwner.getChildAt(0);
            switch (event.getAction()) {
                case DragEvent.ACTION_DRAG_ENTERED:
                    v.setAlpha((float)0.7);
                    break;
                case DragEvent.ACTION_DROP:
                    visitedImage.setAlpha((float)1.0);
                    if (visitorOwner != visitedOwner) {
                        visitedOwner.removeView(visitedImage);
                        visitorOwner.removeView(visitorView);
                        visitorOwner.addView(visitedImage);
                        LinearLayout container = (LinearLayout) v;
                        container.addView(visitorView);
                    }else {
                        visitedImage.performClick(); //               
                    }
                    break;
                case DragEvent.ACTION_DRAG_ENDED:
                    v.setAlpha((float)1.0);
                    visitedImage.setAlpha((float)1.0);
                    break;
                case DragEvent.ACTION_DRAG_EXITED:
                    v.setAlpha((float)1.0);
                    break;
            }
            return true;
        }
    };
 
 
}

ここでは傍受を公共の静的方法として提案しました
一方で多重化のため、
一方、複数のImageViewが互いにドラッグする際の多指ドラッグ衝突のためである.コア思想:サブコントロールのタッチリスニングの呼び出し間隔を判断する.
また、私はクリックイベントとスライドイベントの衝突を処理し、核心思想:親レイアウトのドラッグリスニングでサブコントロールが元の場所に戻ったかどうかを判断し、元の場所に戻った場合、サブコントロールのシミュレーションクリックを呼び出し、
クリックとスライドが衝突した原因:1.スライドリスニングがtrueに戻ると、クリックイベントが消費され、クリックイベントがトリガーされなくなる(ソース角度)
2.OnTouchListenerの押下イベントがドラッグを開始すると、OnTouchListenerはUPイベント(ドラッグの影響)を受け取ることができず、
3.OnTouchListenerの傍受中に戻るfalseと書かれていても、ドラッグをオンにすることによってtrueに戻る.
クリックとスライドの衝突の解決思想:1.親レイアウトのドラッグ・リスナーで、開始点と終了点が同じlayoutにあるかどうかを判断します.
2.第1の条件を満たす場合、layoutの最初の子供を取得し、子供のクリックイベントを実行する(performClick()をシミュレートする).