Android: ImageView, который распространяется на TouchEvent для Drag

1

Я написал простую карточную игру, в которой пользователь играет свою карточку, делая TAP на одном из трех изображений (карты). Я хотел бы добавить возможность играть в карточку, перетащив ImageView на "таблицу" (таблица другая макет или просто другая часть экрана).

Я попытался использовать techinc, указанный в http://blahti.wordpress.com/2011/01/17/moving-views-part-2/, но поскольку он использует AbsoluteLayout, он вводит множество ограничений на мой текущий макет, больше он требует корректировок в зависимости от разрешения экрана устройства, где приложение работает. Я бы хотел избежать этого, продолжая использовать -if possibile- RelativeLayout. Возможно, отправной точкой является расширение ImageView с добавлением поддержки onTouch, но я не смог воспроизвести желаемый эффект (перетащить). Любая идея или предложение или образец кода? Благодарю!

Чтобы дать представление, это проект макета. 3 карты ниже должны быть перемещены с помощью перетаскивания.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="fill_parent" android:layout_height="fill_parent"
>
<RelativeLayout android:id="@+id/player_cards_layout" 
    android:layout_width="fill_parent" android:layout_height="150dip"
    android:gravity="center_horizontal"
    android:background="#55335588"
    android:layout_above="@+id/player_cards_layout" 
>
    <ImageView android:id="@+id/img_pc_card_1"
        android:layout_width="100dip" android:layout_height="150dip"
        android:src="@drawable/icon"
    />
</RelativeLayout>

<RelativeLayout android:id="@+id/player_cards_layout" 
    android:layout_width="fill_parent" android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:gravity="center_horizontal"
    android:background="#336699"
>

    <ImageView android:id="@+id/img_user_card_1"
        android:layout_width="100dip" android:layout_height="150dip"
        android:src="@drawable/icon"
    />      
    <ImageView android:id="@+id/img_user_card_2" 
        android:layout_width="100dip" android:layout_height="150dip"
        android:src="@drawable/icon"
        android:layout_toRightOf="@+id/img_user_card_1"
    />      
    <ImageView android:id="@+id/img_user_card_3" 
        android:layout_width="100dip" android:layout_height="150dip"
        android:src="@drawable/icon"
        android:layout_toRightOf="@+id/img_user_card_2"
    />
</RelativeLayout>

</RelativeLayout>
  • 0
    Я окончательно решил свои проблемы, изменив подход, и начал использовать методы, предоставленные Blahti. Спасибо ему! blahti.wordpress.com/2011/01/17/moving-views-part-2
Теги:
imageview
drag
ontouchevent
extend

1 ответ

1

вот хороший пример из ссылки. Я надеюсь, что это поможет вам.

разреш/макет/main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent"
    android:gravity="center" android:id="@+id/LinearLayout01">

    <Button android:layout_width="wrap_content"
        android:layout_height="wrap_content" android:id="@+id/btn"
        android:text="Drag Me"></Button>
</FrameLayout>

SRC/COM/шапочка/пример/Home.java

package com.beanie.example;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.FrameLayout.LayoutParams;

public class Home extends Activity implements OnTouchListener {

private final static int START_DRAGGING = 0;
private final static int STOP_DRAGGING = 1;

private Button btn;
private FrameLayout layout;
private int status;
private LayoutParams params;

private ImageView image;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    layout = (FrameLayout) findViewById(R.id.LinearLayout01);
    // layout.setOnTouchListener(this);

    btn = (Button) findViewById(R.id.btn);
    btn.setDrawingCacheEnabled(true);
    btn.setOnTouchListener(this);

    params = new LayoutParams(LayoutParams.WRAP_CONTENT,
            LayoutParams.WRAP_CONTENT);

}

@Override
public boolean onTouch(View view, MotionEvent me) {
    if (me.getAction() == MotionEvent.ACTION_DOWN) {
        status = START_DRAGGING;
        image = new ImageView(this);
        image.setImageBitmap(btn.getDrawingCache());
        layout.addView(image, params);
    }
    if (me.getAction() == MotionEvent.ACTION_UP) {
        status = STOP_DRAGGING;
        Log.i("Drag", "Stopped Dragging");
    } else if (me.getAction() == MotionEvent.ACTION_MOVE) {
        if (status == START_DRAGGING) {
            System.out.println("Dragging");
            image.setPadding((int) me.getRawX(), (int) me.getRawY(), 0, 0);
            image.invalidate();
        }
    }
    return false;
  }
}
  • 0
    Привет, большое спасибо за быстрый ответ! Это хорошая отправная точка. Есть несколько вещей, которые мне нужно уточнить: после отпускания пальца (ACTION_UP) кнопка больше не может двигаться. Более того, мне нужно, чтобы одновременно можно было перемещать более одного элемента (см. Черновик моего приложения): в примере есть только один, и я не могу внести необходимые изменения :-( Я буду благодарен за предложения по улучшению этого кода. ,

Ещё вопросы

Сообщество Overcoder
Наверх
Меню