Android 拖放操作基础学习

Android 拖放操作基础学习
拖动效果如图下
效果图

1 xml文档

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:padding="10dp"
    android:orientation="vertical"
    tools:context="com.yulintu.customcontrol.DragActivity">

    <LinearLayout
        android:id="@+id/red"
        android:padding="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="红色" />

        <ImageView

            android:layout_width="30dp"
            android:background="@color/colorRed"
            android:layout_height="30dp"
            />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/green"
        android:padding="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView

            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="黄色" />

        <ImageView

            android:layout_width="30dp"
            android:background="@color/colorGreen"
            android:layout_height="30dp"
            />
    </LinearLayout>
    <LinearLayout
        android:id="@+id/blue"
        android:padding="8dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content">
        <TextView
            android:gravity="center"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:text="蓝色" />

        <ImageView

            android:layout_width="30dp"
            android:background="@color/colorBlue"
            android:layout_height="30dp"
            />
    </LinearLayout>

    <ImageView
        android:id="@+id/image"
        android:background="#66666666"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

2 activity代码

package com.yulintu.customcontrol;

import android.annotation.TargetApi;
import android.content.ClipData;
import android.content.ClipDescription;
import android.content.Intent;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.DragEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;

import static android.view.View.DRAG_FLAG_GLOBAL;

public class DragActivity extends AppCompatActivity {

    LinearLayout red;
    LinearLayout green;
    LinearLayout blue;
    ImageView imageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drag);
        //初始化被拖动的控件
        red = (LinearLayout) findViewById(R.id.red);
        green = (LinearLayout) findViewById(R.id.green);
        blue = (LinearLayout) findViewById(R.id.blue);
        //为控件设置长按监听事件
        red.setOnLongClickListener(longClickListener);
        green.setOnLongClickListener(longClickListener);
        blue.setOnLongClickListener(longClickListener);
        //初始化被响应拖动的控件
        imageView = (ImageView) findViewById(R.id.image);
        MyDragListener dragListener = new MyDragListener();
        //为响应控件设置拖动的响应事件--一旦拖动产生,回调该响应事件
        imageView.setOnDragListener(dragListener);
    }

    private View.OnLongClickListener longClickListener = new View.OnLongClickListener() {
        @RequiresApi(api = Build.VERSION_CODES.N)
        @Override
        public boolean onLongClick(View v) {
            switch (v.getId()) {
                case R.id.red:
                    startDrag(v, "red");
                case R.id.green:
                    startDrag(v, "green");
                case R.id.blue:
                    startDrag(v, "blue");
                    break;
            }

            return true;
        }
    };

    @TargetApi(Build.VERSION_CODES.N)
    private void startDrag(View v, String tag) {
        //通过ClipData传递数据给响应的控件
        ClipData.Item item = new ClipData.Item(tag);
        ClipData clipData = new ClipData(tag, new String[]{ClipDescription.MIMETYPE_TEXT_PLAIN}, item);
        View.DragShadowBuilder builder = new View.DragShadowBuilder(v);
        v.startDrag(clipData, builder, null, DRAG_FLAG_GLOBAL);
    }

    //设置拖动响应事件
    protected class MyDragListener implements View.OnDragListener {

        @Override
        public boolean onDrag(View v, DragEvent event) {
            int action = event.getAction();
            //一旦拖动产生,回调该响应事件,通过拖动的类型来设置不同的效果
            switch (action) {
                case DragEvent.ACTION_DRAG_STARTED:
                    if (event.getClipDescription().hasMimeType(ClipDescription.MIMETYPE_TEXT_PLAIN)) {
                        v.setBackgroundColor(Color.WHITE);
                        return true;
                    }
                    return false;
                case DragEvent.ACTION_DRAG_ENTERED:
                    v.setBackgroundColor(Color.GRAY);
                    return true;
                case DragEvent.ACTION_DRAG_LOCATION:
                    return true;
                case DragEvent.ACTION_DRAG_EXITED:
                    v.setBackgroundColor(Color.WHITE);
                    return true;
                case DragEvent.ACTION_DROP:
                    //获取拖动事件传递过来的数据
                    ClipData.Item item = event.getClipData().getItemAt(0);
                    CharSequence text = item.getText();
                    String s = String.valueOf(text);
                    //由传递过来的数据来为响应控件设置不同的颜色
                    v.setBackgroundColor(getColor(s));
                    return true;
                case DragEvent.ACTION_DRAG_ENDED:

                    return true;
            }
            return false;
        }
    }

    private int getColor(String s) {
        switch (s) {
            case "red":
                return getResources().getColor(R.color.colorRed);
            case "blue":
                return getResources().getColor(R.color.colorBlue);
            case "green":
                return getResources().getColor(R.color.colorGreen);
        }
        return getResources().getColor(R.color.colorPrimary);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值