次のコードを使用して、1本の指のタッチと2本の指のタッチを検出しました。コードは、ダブルフィンガータッチを検出します(count==2
の場合)。
ワンタッチでもアクションが必要です。 1本の指で画面に触れると、他の部分には行きません。このコードで何を間違えましたか?
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = event.getAction() & MotionEvent.ACTION_MASK;
switch (action) {
case MotionEvent.ACTION_POINTER_UP: {
int count = event.getPointerCount();
Log.v("count >>", count + "");
if (count == 2) {
// some action
} else {
Log.v("count not equal to 2", "not 2");
}
break;
}
}
return true;
}
更新:
このコードをActivity
内で使用しました。シングルタッチ、マルチタッチを検出する必要があります。
私の活動では、左側と右側の2つの画像があります。画像をクリックすると、何らかのプロセスが必要になります。 2本の指を使用する場合は、scale-factor
に従って画像のサイズを変更する必要があります。
これは私が使用したコードです:
更新:
package com.pinch.detect;
import Java.io.BufferedInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.net.MalformedURLException;
import Java.net.URL;
import Java.net.URLConnection;
import Android.app.Activity;
import Android.content.Context;
import Android.content.ContextWrapper;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.os.Bundle;
import Android.util.FloatMath;
import Android.util.Log;
import Android.view.Display;
import Android.view.MotionEvent;
import Android.view.ScaleGestureDetector;
import Android.view.View;
import Android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import Android.view.View.OnClickListener;
import Android.view.View.OnTouchListener;
import Android.widget.ImageView;
import Android.widget.TextView;
import Android.widget.Toast;
public class PinchDetectorActivity extends Activity {
TextView textGestureAction;
ImageView img1, img2;
static Bitmap bm, bm1;
boolean multiTouch = false;
Context context;
float scaleFactor = 0.0f;
float lastscale;
int scr_width, scr_height;
Display display;
private ScaleGestureDetector scaleGestureDetector;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textGestureAction = (TextView) findViewById(R.id.GestureAction);
img1 = (ImageView) findViewById(R.id.img_left);
img2 = (ImageView) findViewById(R.id.img_right);
display = getWindowManager().getDefaultDisplay();
scr_width = display.getWidth();
scr_height = display.getHeight();
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
bm = BitmapFactory.decodeResource(this.getResources(),
R.drawable.fiction1);
img1.setImageBitmap(bm);
bm1 = BitmapFactory.decodeResource(this.getResources(),
R.drawable.fiction2);
img2.setImageBitmap(bm1);
img1.setScaleType(ImageView.ScaleType.FIT_START);
img2.setScaleType(ImageView.ScaleType.FIT_END);
scaleGestureDetector = new ScaleGestureDetector(this,
new MySimpleOnScaleGestureListener());
img1.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
int index = event.getActionIndex();
Log.v("Index value ",index+"");
int action = event.getAction();
if (index == 1) {
multiTouch = true;
System.out.println("mutli1");
} else if (multiTouch == false) {
System.out.println("single1");
img1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.v("clicked image1","img1>>>");
}
});
img2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) { // TODO Auto-generated method
Log.v("clicked image2","img2>>>");
}
});
}
else if (action == MotionEvent.ACTION_MOVE && multiTouch) {
System.out.println("mutli2");
if (scaleFactor > 1) {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_width / 2, scr_height, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_width / 2, scr_height, true);
img2.setImageBitmap(resizedbitmap1);
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
} else if(scaleFactor<1){
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
if (scr_width >= 640) {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_height + 90, scr_height, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_height + 90, scr_height, true);
img2.setImageBitmap(resizedbitmap1);
} else {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_height, scr_height + 30, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_height, scr_height + 30, true);
img2.setImageBitmap(resizedbitmap1);
}
}
} else if (action == MotionEvent.ACTION_MOVE && !multiTouch)
{
System.out.println("single2");
}
return super.onTouchEvent(event);
}
public class MySimpleOnScaleGestureListener extends
SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
// TODO Auto-generated method stub
scaleFactor = detector.getScaleFactor();
Log.v("scaleFactor >>>", scaleFactor + "");
return true;
}
}
}
私のmain.xmlは
<?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="wrap_content"
Android:orientation="vertical"
Android:id="@+id/pinchlay" >
<ImageView
Android:id="@+id/img_left"
Android:layout_width="320dp"
Android:layout_height="fill_parent"
/>
<ImageView
Android:id="@+id/img_right"
Android:layout_width="320dp"
Android:layout_height="fill_parent"
Android:layout_alignParentRight="true"
/>
</RelativeLayout>
私が正しく理解していれば、シングルタッチではACTION_POINTER_UPは発生しませんが、ACTION_UPが発生します。そのため、1本の指を検出しません。参考のためにこの投稿を参照してください: https://stackoverflow.com/a/4269592/108481
前のポスターが示唆したように、アクションアップではなく、シングルタッチポインターアップに対して別々のイベントがあります。 motionEventsのシーケンスは次のとおりです。
ここに マルチタッチイベントを理解するための優れたリソースですが、それらすべてをキャッチするためのアイデアと最も簡単な方法は、switchステートメントを使用することです。私が見つけたこのTouchImageViewを使用します ここ 。スケーリングとパンが可能で、クリックするだけでクリックが実行されるため、その処理コードをOnClickListener()
に追加するか、125行目に挿入することができます。
これは、ポイントを検出し、各ポイントを異なる色で描画するためのコードです ここの例
public class custom_view extends View {
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
public int cu = 0;
final int MAX_NUMBER_OF_POINT = 10;
float[] x = new float[MAX_NUMBER_OF_POINT];
float[] y = new float[MAX_NUMBER_OF_POINT];
boolean[] touching = new boolean[MAX_NUMBER_OF_POINT];
public custom_view(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public custom_view(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public custom_view(Context context) {
super(context);
init();
}
void init() {
Paint.setStyle(Paint.Style.STROKE);
Paint.setStrokeWidth(40);
}
@Override
protected void onDraw(Canvas canvas) {
for (int i = 0; i < MAX_NUMBER_OF_POINT; i++) {
if (touching[i]) {
switch (i) {
case 1:
Paint.setColor(Color.BLUE);
break;
case 2:
Paint.setColor(Color.RED);
break;
case 3:
Paint.setColor(Color.CYAN);
break;
case 4:
Paint.setColor(Color.GREEN);
break;
case 5:
Paint.setColor(Color.YELLOW);
break;
case 6:
Paint.setColor(Color.Magenta);
break;
case 7:
Paint.setColor(Color.DKGRAY);
break;
case 8:
Paint.setColor(Color.LTGRAY);
break;
case 9:
Paint.setColor(Color.GREEN);
break;
case 10:
Paint.setColor(Color.BLACK);
break;
}
canvas.drawCircle(x[i], y[i], 70f, Paint);
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec),
MeasureSpec.getSize(heightMeasureSpec));
}
@Override
public boolean onTouchEvent(MotionEvent event) {
int action = (event.getAction() & MotionEvent.ACTION_MASK);
int pointCount = event.getPointerCount();
for (int i = 0; i < pointCount; i++) {
int id = event.getPointerId(i);
if (id < MAX_NUMBER_OF_POINT) {
x[id] = (int) event.getX(i);
y[id] = (int) event.getY(i);
if ((action == MotionEvent.ACTION_DOWN)
|| (action == MotionEvent.ACTION_POINTER_DOWN)
|| (action == MotionEvent.ACTION_MOVE)) {
touching[id] = true;
} else {
touching[id] = false;
}
}
}
invalidate();
return true;
}
}
OnDoubleTapListener を使用してみましたか?
これを見つけました チュートリアル これは、シングルタップとダブルタップを検出する方法を示すのにも役立ちます。
ACTION_DOWN
を確認しましたが、同時にACTION_POINTER_DOWN
も確認する必要があります。これはより明確です。それを試してみてください
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
int action = event.getAction();
if( (action == MotionEvent.ACTION_DOWN) && (action != MotionEvent.ACTION_POINTER_DOWN))
// Single touch
else if ( action == MotionEvent.ACTION_POINTER_DOWN)
//multi touch
return true;
}
編集済み
boolean multiTouch=false;
@Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
int index= event.getActionIndex();
int action = event.getAction();
if( index ==1)
{
multiTouch=true;
System.out.println("mutli");
}
else if (multiTouch==false)
System.out.println("single");
//else if (action== MotionEvent.ACTION_POINTER_1_UP)
// multiTouch=false;
else if (action== MotionEvent.ACTION_MOVE && multiTouch)
System.out.println("mutli");
else if (action== MotionEvent.ACTION_MOVE && !multiTouch)
System.out.println("single");
return super.onTouchEvent(event);
}
編集:
package com.pinch.detect;
import Java.io.BufferedInputStream;
import Java.io.IOException;
import Java.io.InputStream;
import Java.net.MalformedURLException;
import Java.net.URL;
import Java.net.URLConnection;
import Android.app.Activity;
import Android.content.Context;
import Android.content.ContextWrapper;
import Android.graphics.Bitmap;
import Android.graphics.BitmapFactory;
import Android.os.Bundle;
import Android.util.FloatMath;
import Android.util.Log;
import Android.view.Display;
import Android.view.MotionEvent;
import Android.view.ScaleGestureDetector;
import Android.view.View;
import Android.view.ScaleGestureDetector.SimpleOnScaleGestureListener;
import Android.view.View.OnClickListener;
import Android.view.View.OnTouchListener;
import Android.widget.ImageView;
import Android.widget.TextView;
import Android.widget.Toast;
public class PinchDetectorActivity extends Activity {
TextView textGestureAction;
ImageView img1, img2;
static Bitmap bm, bm1;
boolean multiTouch = false;
Context context;
float scaleFactor = 0.0f;
float lastscale;
int scr_width, scr_height;
Display display;
private ScaleGestureDetector scaleGestureDetector;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textGestureAction = (TextView) findViewById(R.id.GestureAction);
img1 = (ImageView) findViewById(R.id.img_left);
img2 = (ImageView) findViewById(R.id.img_right);
display = getWindowManager().getDefaultDisplay();
scr_width = display.getWidth();
scr_height = display.getHeight();
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
bm = BitmapFactory.decodeResource(this.getResources(),
R.drawable.fiction1);
img1.setImageBitmap(bm);
bm1 = BitmapFactory.decodeResource(this.getResources(),
R.drawable.fiction2);
img2.setImageBitmap(bm1);
img1.setScaleType(ImageView.ScaleType.FIT_START);
img2.setScaleType(ImageView.ScaleType.FIT_END);
scaleGestureDetector = new ScaleGestureDetector(this,
new MySimpleOnScaleGestureListener());
img1.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
system.out.println("Image 1 touched");
return false;
}
});
img2.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
system.out.println("Image 2 touched");
return false;
}
});
}
@Override
public boolean onTouchEvent(MotionEvent event) {
scaleGestureDetector.onTouchEvent(event);
int index = event.getActionIndex();
Log.v("Index value ",index+"");
int action = event.getAction();
if (index == 1) {
multiTouch = true;
System.out.println("mutli1");
} else if (multiTouch == false) {
System.out.println("single1");
img1.onTouch(view, event);
}
else if (action == MotionEvent.ACTION_MOVE && multiTouch) {
System.out.println("mutli2");
img2.onTouch(view, event);
if (scaleFactor > 1) {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_width / 2, scr_height, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_width / 2, scr_height, true);
img2.setImageBitmap(resizedbitmap1);
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
} else if(scaleFactor<1){
Log.v("width >>", Integer.toString(scr_width));
Log.v("height >>", Integer.toString(scr_height));
if (scr_width >= 640) {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_height + 90, scr_height, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_height + 90, scr_height, true);
img2.setImageBitmap(resizedbitmap1);
} else {
Bitmap resizedbitmap = Bitmap.createScaledBitmap(bm,
scr_height, scr_height + 30, true);
img1.setImageBitmap(resizedbitmap);
Bitmap resizedbitmap1 = Bitmap.createScaledBitmap(bm1,
scr_height, scr_height + 30, true);
img2.setImageBitmap(resizedbitmap1);
}
}
} else if (action == MotionEvent.ACTION_MOVE && !multiTouch)
{
System.out.println("single2");
}
return super.onTouchEvent(event);
}
public class MySimpleOnScaleGestureListener extends
SimpleOnScaleGestureListener {
@Override
public boolean onScale(ScaleGestureDetector detector) {
// TODO Auto-generated method stub
scaleFactor = detector.getScaleFactor();
Log.v("scaleFactor >>>", scaleFactor + "");
return true;
}
}
}
最新:
if (index == 1) {
multiTouch = true;
img2.onTouch(view, event);
System.out.println("mutli1");
} else if (multiTouch == false) {
System.out.println("single1");
img1.onTouch(view, event);
}
else if (action == MotionEvent.ACTION_MOVE && multiTouch) {
System.out.println("mutli2");
シングルタッチでcount == 2を再現できません。ワンタッチで1です。実際のデバイスでコードをデバッグして、実際に何があるかを確認してください。
Event.getPointerId(i)をevent.getPointerCount()と一緒に使用して、これらの実際の接点が何であるかを確認してください。
MultiTouchにはPointerIDを使用する必要があります。これを参照してください完全な例
private View.OnTouchListener OnTouchListener = new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent event) {
int pointerIndex = ((event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT);
int action = event.getAction() & MotionEvent.ACTION_MASK;
int pointerId = event.getPointerId(pointerIndex);
Log.i("", "Pointer ID = " + pointerId);
switch (action) {
case MotionEvent.ACTION_POINTER_UP: {
break;
}
}
return true;
}
};