Android的拖放功能 [英] Android Drag and Drop functionality

查看:146
本文介绍了Android的拖放功能的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有某种方式来实现拖动和API 8拖放功能的Andr​​oid?

Is there some way to implement drag and drop functionality in API 8 Android?

看着这里,但它似乎API 11后。

Looked here, but it appears after API 11.

我需要从一个的LinearLayout 拖动视图到另一个。何我可以实现这个API上8?

I need to drag view from one LinearLayout to another. Ho can i implement this on API 8?

推荐答案

试试这样

import android.app.Activity;
import android.content.ClipData;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.DragEvent;
import android.view.View;
import android.view.View.DragShadowBuilder;
import android.view.View.OnDragListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class MainActivity extends Activity {

ListView source = null;
TextView target1 = null;
TextView target2 = null;
TextView target3 = null;

String[] listItems = {"Samsung", "Apple", "Google", "Nokia"};

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    source = (ListView)findViewById(R.id.dragSource);
    target1 = (TextView) findViewById(R.id.dragTarget1);
    target2 = (TextView) findViewById(R.id.dragTarget2);
    target3 = (TextView) findViewById(R.id.dragTarget3);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, listItems);
    source.setAdapter(adapter);

    // Start Drag
    source.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position,
                long id) {
            String item = listItems[position];

            ClipData data = ClipData.newPlainText("DragIt", item);
            source.startDrag(data, new MyShadowBuilder(view), null, 0);
        }
    });

    // Handle Drag
    target1.setOnDragListener(new MyDragListener());
    target2.setOnDragListener(new MyDragListener());
    target3.setOnDragListener(new MyDragListener());
}

// Drag Shadow
private class MyShadowBuilder extends DragShadowBuilder {

    public MyShadowBuilder(View v) {
        super(v);
    }

    @Override
    public void onDrawShadow(Canvas canvas) {
        // Set Drag image background or anything you want
        int width = getView().getWidth();
        int height = getView().getHeight();
        Paint paint = new Paint();
        paint.setColor(0x55858585);

        canvas.drawRect(new Rect(0, 0, width, height), paint);

        super.onDrawShadow(canvas);
    }

    @Override
    public void onProvideShadowMetrics(Point shadowSize,
            Point shadowTouchPoint) {

        int width = getView().getWidth();
        int height = getView().getHeight();

        shadowSize.set(width, height);

        shadowTouchPoint.set(width/2, height);
    }
}

// Drag Listener
private class MyDragListener implements OnDragListener {
    private final int DEFAULT_BG_COLOR = 0xFF858585;
    private final int HIGHLIGHT_BG_COLOR = 0xFF0000FF;

    @Override
    public boolean onDrag(View v, DragEvent event) {

        if(event.getAction() == DragEvent.ACTION_DRAG_ENTERED) {
            v.setBackgroundColor(HIGHLIGHT_BG_COLOR);
        }
        else if(event.getAction() == DragEvent.ACTION_DRAG_EXITED) {
            v.setBackgroundColor(DEFAULT_BG_COLOR);
        }
        else if(event.getAction() == DragEvent.ACTION_DROP) {
            // Perform drop
            ClipData clip = event.getClipData();
            ClipData.Item item = clip.getItemAt(0);
            String text = item.getText().toString();

            ((TextView) v).setText(text);
            v.setBackgroundColor(DEFAULT_BG_COLOR);
        }
        // Send true to listen All Drag Events.
        return true; 
    }
}
}

XML是这样的:

XML is like:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >

<LinearLayout
    android:layout_width="161dp"
    android:layout_height="fill_parent"
    android:background="#FF858585"
    android:orientation="vertical" >


    <TextView
        android:id="@+id/dragTarget1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.04"
        android:text="Drop Here"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/dragTarget2"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.04"
        android:text="Drop Here"
        android:textAppearance="?android:attr/textAppearanceLarge" />

    <TextView
        android:id="@+id/dragTarget3"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0.04"
        android:text="Drop Here"
        android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ListView
        android:id="@+id/dragSource"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

这篇关于Android的拖放功能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆