画像をタッチする
ImageViewに画像を表示してタッチしたときの判定処理を紹介します。
package test.example.com.test46;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Rect;
import android.provider.ContactsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.RelativeLayout;
public class MainActivity extends AppCompatActivity {
private int mNo1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView(R.layout.activity_main);
RelativeLayout layout = new RelativeLayout(this);
layout.setBackgroundColor(Color.BLUE);
setContentView(layout);
//座標の初期設定
int x=0;
int y=0;
int width=0;
int height=0;
mNo1 = View.generateViewId();
//配置を設定
x=200;
y=300;
width=120;
height=120;
RelativeLayout.LayoutParams obj1 = null;
obj1=getLayoutObject(width, height);
obj1.leftMargin=x;
obj1.topMargin=y;
//画像を準備
Bitmap bitmap= BitmapFactory.decodeResource(getResources(), R.mipmap.icon);
//ImageViewを設置し画像を設定します
ImageView imageView=new ImageView(this);
imageView.setId(mNo1);
imageView.setImageBitmap(bitmap);
//Tagを画像の拡縮制御に使用しています
imageView.setTag(0);//小さい状態
layout.addView(imageView,obj1);
imageView=null;
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
float fX=0.0f;
float fY=0.0f;
fX = event.getX();
fY = event.getY();
Log.d("座標",String.format("x:%f y:%f",fX, fY));
//「ACTION_DOWN」はタップした時の判定値です
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
//タッチしたら実行する
judgeTouchGril((int)fX, (int)fY);
}
//戻り値について
//fasle:標準
//true:抑制(他(ViewやActivity)への通知を抑制します
return false;
}
private void judgeTouchGril(int intX, int intY)
{
//タイトルバーの高さ
int iTitlebarHeight=0;
iTitlebarHeight=(int)getTitlebarHeight();
Log.d("タイトルバーの高さ",String.format("height:%d",iTitlebarHeight));
//画像の位置
int iImageX=0;
int iImageY=0;
int iImageWidth=0;
int iImageHeight=0;
ImageView imageView=(ImageView)findViewById(mNo1);
iImageX=(int)imageView.getX();
iImageY=(int)imageView.getY() + iTitlebarHeight;
iImageWidth=imageView.getWidth();
iImageHeight=imageView.getHeight();
Log.d("girl position",String.format("x:%d y:%d w:%d h:%d "
,iImageX,iImageY,iImageWidth,iImageHeight));
if((iImageX <= intX && intX <= (iImageX + iImageWidth))
&& (iImageY <= intY && intY <= (iImageY + iImageHeight)))
{
Log.d("","タッチしました。" );
}
//タッチされた場合のログ出力例
/*
座標: x:209.428711 y:340.405273
タイトルバーの高さ: height:38
girl position: x:200 y:338 w:120 h:120
タッチしました。
*/
}
private float getTitlebarHeight()
{
final Rect rect=new Rect();
Window window=this.getWindow();
window.getDecorView().getWindowVisibleDisplayFrame(rect);
return rect.top;
}
//レイアウトを決定するオブジェクトを生成し渡します
private RelativeLayout.LayoutParams getLayoutObject(int width,int height)
{
return new RelativeLayout.LayoutParams(width, height);
}
}
|
「onTouchEvent」イベントを使用して座標を取得しています。
イベントの引数に「Event」変数があるので、これを利用して
次の例のようにx座標とy座標を取得しています。
(例)
fX = event.getX();
fY = event.getY();
このサンプルではImageViewのタップ判定をしています。
タイトルバーの高さ分だけy座標の位置がずれてしまうので、
個の高さを考慮した計算判定をしています。
試した結果
実行結果
座標: x:209.428711 y:340.405273
タイトルバーの高さ: height:38
girl position: x:200 y:338 w:120 h:120
タッチしました。
<resources>
<!-- Base application theme. -->
<!-- 「Theme.AppCompat.Light.DarkActionBar」 -->
<style name="AppTheme" parent="Theme.AppCompat.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
|
|
|