2011年6月5日日曜日

ドラッグで画像移動-FrameLayout+重なり判定-getHitRect

ドラッグ&ドロップをFrameLayout で実現

重なりの判定がズレる不具合に悩まされましたが
ボタンのプロパティーのlayout_heightとlayout_widthをfill_parentに設定すればいいようです。
fill_parentに設定する為にTableLayoutの中にボタンを置きました。


アイコン画像をドラッグしてボタンの上に重ねると初期画面にする。

package com.drag;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.Button;
import android.widget.ImageView;

public class Drag extends Activity implements OnTouchListener {
 /** Called when the activity is first created. */
 ImageView target;
 int currentX;
 int currentY;
 int offsetX;
 int offsetY;

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

  target = (ImageView) findViewById(R.id.ImageView01);
  this.target.setOnTouchListener(this);
 }
 
 public void onClickButton02(View v) {
  Intent intent = new Intent(Drag.this, Drag.class);
  startActivity(intent);
 }

 @Override
 public boolean onTouch(View v, MotionEvent event) {
  // TODO 自動生成されたメソッド・スタブ
  int x = (int) event.getRawX();
  int y = (int) event.getRawY();

  Button bt2 = (Button) findViewById(R.id.Button02);

  if (event.getAction() == MotionEvent.ACTION_MOVE) {

   int diffX = offsetX - x;
   int diffY = offsetY - y;

   currentX -= diffX;
   currentY -= diffY;
   target.layout(currentX, currentY, currentX + target.getWidth(),
     currentY + target.getHeight());

   offsetX = x;
   offsetY = y;

  } else if (event.getAction() == MotionEvent.ACTION_DOWN) {
   offsetX = x;
   offsetY = y;
  } else if (event.getAction() == MotionEvent.ACTION_UP) {
   int[] offset = new int[2];
   bt2.getLocationOnScreen(offset);
   Rect rect = new Rect();

   bt2.getHitRect(rect);
   rect.offset(offset[0], offset[1]);

   if (rect.contains((int) event.getRawX(), (int) event.getRawY())) {
   // if (rect.contains(x, y)) {
    bt2.performClick();
   }
  }
  return true;
 }
}

ダウンロード

関連記事

0 件のコメント:

コメントを投稿