美文网首页UI
Android多个ImageView拖拽互换图片

Android多个ImageView拖拽互换图片

作者: 沫沫么么哒Die | 来源:发表于2022-06-06 16:51 被阅读0次

    一、代码

    layout_one.xml

    <?xml version="1.0" encoding="utf-8"?>
    <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
           <LinearLayout
              android:id="@+id/release_view_two_1_layout_1"
              android:layout_width="match_parent"
              android:layout_height="245dp">
    
                <ImageView
                     android:id="@+id/release_iv1_view_two_1"
                     android:layout_width="match_parent"
                     android:layout_height="match_parent"
                     android:scaleType="centerCrop"
                     app:rRadius="4dp"
                     android:src="@mipmap/defualt" />
    
            </LinearLayout>
    
            <LinearLayout
                android:id="@+id/release_view_two_1_layout_2"
                android:layout_width="85dp"
                android:layout_height="85dp"
                android:layout_alignParentEnd="true"
                android:layout_marginTop="150dp"
                android:layout_marginEnd="10dp">
    
                   <ImageView
                      android:id="@+id/release_iv2_view_two_1"
                      android:layout_width="match_parent"
                      android:layout_height="match_parent"
                      app:rRadius="4dp"
                      android:scaleType="centerCrop"
                      android:src="@mipmap/defualt" />
              </LinearLayout>
    
    </androidx.constraintlayout.widget.ConstraintLayout>
    

    注意,两个ImageView要分别用Layout单独装起来

    ViewOne.java

    public class ViewOne extends ConstraintLayout {
     private ArrayList<String> list;
     public PosterStyleView(@NonNull Context context, ArrayList<String> list) {
            super(context);
            this.list = list;
            initView(context);
        }
    
    private void initView(Context context){
      ...
      R.layout.layout_one
      ...
      ImageView iv1= findViewById(R.id.release_iv1_view_two_1);
      ImageView  iv2 = findViewById(R.id.release_iv2_view_two_1);
    
      LinearLayout  layout1 = findViewById(R.id.release_view_two_1_layout_1);
      LinearLayout  layout2 = findViewById(R.id.release_view_two_1_layout_2);
    
      //添加ImageView的触摸监听和各自父布局的拖拽监听
      iv1.setOnTouchListener(ImgUtils.MyTouchEvent);
      layout1.setOnDragListener(ImgUtils.MyDragListener);
    
      iv2..setOnTouchListener(ImgUtils.MyTouchEvent);
      layout2.setOnDragListener(ImgUtils.MyDragListener);
    
      iv1.setTag(list.get(0));
      Glide.with(context).load(list.get(0)).apply(new RequestOptions().override(800, 800)).dontAnimate().into(iv1);
      iv2.setTag(list.get(1));
      Glide.with(context).load(list.get(1)).apply(new RequestOptions().override(800, 800)).dontAnimate().into(iv2);
    
    private void refresh() {
      Glide.with(context).load((String)iv1.getTag()).apply(new RequestOptions().override(800, 800)).dontAnimate().into(iv1);
      Glide.with(context).load((String)iv2.getTag()).apply(new RequestOptions().override(800, 800)).dontAnimate().into(iv2);
    }
    }
    

    ImgUtils.java

    import android.content.ClipData;
    import android.os.Build;
    import android.view.DragEvent;
    import android.view.MotionEvent;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.LinearLayout;
    
    import androidx.annotation.RequiresApi;
    import org.greenrobot.eventbus.EventBus;
    
    public class ImgUtils {
    
        public interface onTouchListener {
            void touch();
        }
    
        public static onTouchListener mOnTouchListener;
    
        public static void setOnTouchListener(onTouchListener onTouchListener) {
            mOnTouchListener = onTouchListener;
        }
    
        private static long lastTime;
        public static View.OnTouchListener MyTouchEvent = new View.OnTouchListener() {
    
            private float x1;
            private float y1;
    
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (mOnTouchListener != null) {
                    mOnTouchListener.touch();
                }
    
    
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    x1 = event.getX();
                    y1 = event.getY();
                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                    long time = System.currentTimeMillis();
                    if ((time - lastTime) < 500) { // 间隔小于500毫秒,视为点击事件
                        return false;
                    }
                } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
                    v.getParent().requestDisallowInterceptTouchEvent(true);
                    float x2 = event.getX();
                    float y2 = event.getY();
                    if (y1 - y2 > 2 || y2 - y1 > 2 || x1 - x2 > 2 || x2 - x1 > 2) {//滑动一定距离
                        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);
                    }
                }
                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_STARTED:
                        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);
                            EventBus.getDefault().post(new EventView());
                        } 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;
            }
        };
    }
    
    
    

    Activity.java

    onCreate(...){
        EventBus.getDefault().register(this);
     }
    
    private void setView(){
          ViewOne viewone = new ViewOne(this,list);
          frameLayout.removeAllViews();
          frameLayout.addView(viewone);
    }
    
        @Subscribe
        public void onMessageEvent(EventView event) {
            if(viewone !=null){
            viewone.refresh();
            }
    
        @Override
        protected void onDestroy() {
             if (EventBus.getDefault().isRegistered(this)) {
                  EventBus.getDefault().unregister(this);
              }
        }
    
    

    相关文章

      网友评论

        本文标题:Android多个ImageView拖拽互换图片

        本文链接:https://www.haomeiwen.com/subject/ksujmrtx.html