E/dalvikvm( 792): Could not find method android.view.MotionEvent.getX, referenced from method com.example.android.touchexample.TouchExampleView.onTouchEvent
W/dalvikvm( 792): VFY: unable to resolve virtual method 17: Landroid/view/MotionEvent;.getX (I)F
W/dalvikvm( 792): VFY: rejecting opcode 0x6e at 0x0006
W/dalvikvm( 792): VFY: rejected Lcom/example/android/touchexample/TouchExampleView;.onTouchEvent (Landroid/view/MotionEvent;)Z
W/dalvikvm( 792): Verifier rejected class Lcom/example/android/touchexample/TouchExampleView;
D/AndroidRuntime( 792): Shutting down VM
W/dalvikvm( 792): threadid=3: thread exiting with uncaught exception (group=0x4000fe70)
public class Singleton { <br/>
// Private constructor prevents instantiation from other classes <br/>
private Singleton ( ) { } <br/>
/**<br/>
* SingletonHolder Singleton.getInstance() <br/>
* SingletonHolder.INSTANCE, .<br/>
*/ <br/>
private static class SingletonHolder { <br/>
private static final Singleton INSTANCE = new Singleton ( ) ; <br/>
} <br/>
public static Singleton getInstance ( ) { <br/>
return SingletonHolder. INSTANCE ; <br/>
} <br/>
}
<?xml version = "1.0" encoding = "utf-8" ?> <br/>
<manifest xmlns:android = "schemas.android.com/apk/res/android" <br/>
package = "com.example.android.touchexample" <br/>
android:versionCode = "1" <br/>
android:versionName = "1.0" > <br/>
<application android:icon = "@drawable/icon" android:label = "@string/app_name" > <br/>
<activity android:name = ".TouchExampleActivity" <br/>
android:label = "@string/app_name" > <br/>
<intent-filter > <br/>
<action android:name = "android.intent.action.MAIN" /> <br/>
<category android:name = "android.intent.category.LAUNCHER" /> <br/>
</intent-filter > <br/>
</activity > <br/>
</application > <br/>
<uses-sdk android:minSdkVersion = "3" android:targetSdkVersion = "8" /> <br/>
</manifest >
public abstract class VersionedGestureDetector { <br/>
OnGestureListener mListener ; <br/>
<br/>
public abstract boolean onTouchEvent ( MotionEvent ev ) ; <br/>
<br/>
public interface OnGestureListener { <br/>
public void onDrag ( float dx, float dy ) ; <br/>
public void onScale ( float scaleFactor ) ; <br/>
} <br/>
}
private static class CupcakeDetector extends VersionedGestureDetector { <br/>
float mLastTouchX ; <br/>
float mLastTouchY ; <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
switch ( ev. getAction ( ) ) { <br/>
case MotionEvent. ACTION_DOWN : { <br/>
mLastTouchX = ev. getX ( ) ; <br/>
mLastTouchY = ev. getY ( ) ; <br/>
break ; <br/>
} <br/>
case MotionEvent. ACTION_MOVE : { <br/>
final float x = ev. getX ( ) ; <br/>
final float y = ev. getY ( ) ; <br/>
mListener. onDrag ( x - mLastTouchX, y - mLastTouchY ) ; <br/>
<br/>
mLastTouchX = x ; <br/>
mLastTouchY = y ; <br/>
break ; <br/>
} <br/>
} <br/>
return true ; <br/>
} <br/>
}
<br/>
private static class CupcakeDetector extends VersionedGestureDetector { <br/>
float mLastTouchX ; <br/>
float mLastTouchY ; <br/>
<br/>
float getActiveX ( MotionEvent ev ) { <br/>
return ev. getX ( ) ; <br/>
} <br/>
float getActiveY ( MotionEvent ev ) { <br/>
return ev. getY ( ) ; <br/>
} <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
switch ( ev. getAction ( ) ) { <br/>
case MotionEvent. ACTION_DOWN : { <br/>
mLastTouchX = getActiveX ( ev ) ; <br/>
mLastTouchY = getActiveY ( ev ) ; <br/>
break ; <br/>
} <br/>
case MotionEvent. ACTION_MOVE : { <br/>
final float x = getActiveX ( ev ) ; <br/>
final float y = getActiveY ( ev ) ; <br/>
mListener. onDrag ( x - mLastTouchX, y - mLastTouchY ) ; <br/>
<br/>
mLastTouchX = x ; <br/>
mLastTouchY = y ; <br/>
break ; <br/>
} <br/>
} <br/>
return true ; <br/>
} <br/>
}
<br/>
private static class EclairDetector extends CupcakeDetector { <br/>
private static final int INVALID_POINTER_ID = - 1 ; <br/>
private int mActivePointerId = INVALID_POINTER_ID ; <br/>
private int mActivePointerIndex = 0 ; <br/>
@Override<br/>
float getActiveX ( MotionEvent ev ) { <br/>
return ev. getX ( mActivePointerIndex ) ; <br/>
} <br/>
@Override<br/>
float getActiveY ( MotionEvent ev ) { <br/>
return ev. getY ( mActivePointerIndex ) ; <br/>
} <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
final int action = ev. getAction ( ) ; <br/>
switch ( action & MotionEvent. ACTION_MASK ) { <br/>
case MotionEvent. ACTION_DOWN : <br/>
mActivePointerId = ev. getPointerId ( 0 ) ; <br/>
break ; <br/>
case MotionEvent. ACTION_CANCEL : <br/>
case MotionEvent. ACTION_UP : <br/>
mActivePointerId = INVALID_POINTER_ID ; <br/>
break ; <br/>
case MotionEvent. ACTION_POINTER_UP : <br/>
final int pointerIndex = ( ev. getAction ( ) & MotionEvent. ACTION_POINTER_INDEX_MASK ) <br/>
>> MotionEvent. ACTION_POINTER_INDEX_SHIFT ; <br/>
final int pointerId = ev. getPointerId ( pointerIndex ) ; <br/>
if ( pointerId == mActivePointerId ) { <br/>
// This was our active pointer going up. Choose a new <br/>
// active pointer and adjust accordingly. <br/>
final int newPointerIndex = pointerIndex == 0 ? 1 : 0 ; <br/>
mActivePointerId = ev. getPointerId ( newPointerIndex ) ; <br/>
mLastTouchX = ev. getX ( newPointerIndex ) ; <br/>
mLastTouchY = ev. getY ( newPointerIndex ) ; <br/>
} <br/>
break ; <br/>
} <br/>
mActivePointerIndex = ev. findPointerIndex ( mActivePointerId ) ; <br/>
return super. onTouchEvent ( ev ) ; <br/>
} <br/>
}
private static class CupcakeDetector extends VersionedGestureDetector { <br/>
float mLastTouchX ; <br/>
float mLastTouchY ; <br/>
<br/>
float getActiveX ( MotionEvent ev ) { <br/>
return ev. getX ( ) ; <br/>
} <br/>
float getActiveY ( MotionEvent ev ) { <br/>
return ev. getY ( ) ; <br/>
} <br/>
<br/>
boolean shouldDrag ( ) { <br/>
return true ; <br/>
} <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
switch ( ev. getAction ( ) ) { <br/>
case MotionEvent. ACTION_DOWN : { <br/>
mLastTouchX = getActiveX ( ev ) ; <br/>
mLastTouchY = getActiveY ( ev ) ; <br/>
break ; <br/>
} <br/>
case MotionEvent. ACTION_MOVE : { <br/>
final float x = getActiveX ( ev ) ; <br/>
final float y = getActiveY ( ev ) ; <br/>
<br/>
if ( shouldDrag ( ) ) { <br/>
mListener. onDrag ( x - mLastTouchX, y - mLastTouchY ) ; <br/>
} <br/>
<br/>
mLastTouchX = x ; <br/>
mLastTouchY = y ; <br/>
break ; <br/>
} <br/>
} <br/>
return true ; <br/>
} <br/>
}
private static class FroyoDetector extends EclairDetector { <br/>
private ScaleGestureDetector mDetector ; <br/>
public FroyoDetector ( Context context ) { <br/>
mDetector = new ScaleGestureDetector ( context,<br/>
new ScaleGestureDetector. SimpleOnScaleGestureListener ( ) { <br/>
@Override public boolean onScale ( ScaleGestureDetector detector ) { <br/>
mListener. onScale ( detector. getScaleFactor ( ) ) ; <br/>
return true ; <br/>
} <br/>
} ) ; <br/>
} <br/>
@Override<br/>
boolean shouldDrag ( ) { <br/>
return ! mDetector. isInProgress ( ) ; <br/>
} <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
mDetector. onTouchEvent ( ev ) ; <br/>
return super. onTouchEvent ( ev ) ; <br/>
} <br/>
}
public static VersionedGestureDetector newInstance ( Context context,<br/>
OnGestureListener listener ) { <br/>
final int sdkVersion = Integer. parseInt ( Build. VERSION . SDK ) ; <br/>
VersionedGestureDetector detector = null ; <br/>
if ( sdkVersion < Build. VERSION_CODES . ECLAIR ) { <br/>
detector = new CupcakeDetector ( ) ; <br/>
} else if ( sdkVersion < Build. VERSION_CODES . FROYO ) { <br/>
detector = new EclairDetector ( ) ; <br/>
} else { <br/>
detector = new FroyoDetector ( context ) ; <br/>
} <br/>
detector. mListener = listener ; <br/>
return detector ; <br/>
}
public class TouchExampleView extends View { <br/>
private Drawable mIcon ; <br/>
private float mPosX ; <br/>
private float mPosY ; <br/>
private VersionedGestureDetector mDetector ; <br/>
private float mScaleFactor = 1. f ; <br/>
public TouchExampleView ( Context context ) { <br/>
this ( context, null, 0 ) ; <br/>
} <br/>
public TouchExampleView ( Context context, AttributeSet attrs ) { <br/>
this ( context, attrs, 0 ) ; <br/>
} <br/>
public TouchExampleView ( Context context, AttributeSet attrs, int defStyle ) { <br/>
super ( context, attrs, defStyle ) ; <br/>
mIcon = context. getResources ( ) . getDrawable ( R. drawable . icon ) ; <br/>
mIcon. setBounds ( 0 , 0 , mIcon. getIntrinsicWidth ( ) , mIcon. getIntrinsicHeight ( ) ) ; <br/>
<br/>
mDetector = VersionedGestureDetector. newInstance ( context, new GestureCallback ( ) ) ; <br/>
} <br/>
@Override<br/>
public boolean onTouchEvent ( MotionEvent ev ) { <br/>
mDetector. onTouchEvent ( ev ) ; <br/>
return true ; <br/>
} <br/>
@Override<br/>
public void onDraw ( Canvas canvas ) { <br/>
super. onDraw ( canvas ) ; <br/>
canvas. save ( ) ; <br/>
canvas. translate ( mPosX, mPosY ) ; <br/>
canvas. scale ( mScaleFactor, mScaleFactor ) ; <br/>
mIcon. draw ( canvas ) ; <br/>
canvas. restore ( ) ; <br/>
} <br/>
private class GestureCallback implements VersionedGestureDetector. OnGestureListener { <br/>
public void onDrag ( float dx, float dy ) { <br/>
mPosX + = dx ; <br/>
mPosY + = dy ; <br/>
invalidate ( ) ; <br/>
} <br/>
public void onScale ( float scaleFactor ) { <br/>
mScaleFactor * = scaleFactor ; <br/>
// Don't let the object get too small or too large. <br/>
mScaleFactor = Math. max ( 0.1f , Math. min ( mScaleFactor, 5.0f ) ) ; <br/>
invalidate ( ) ; <br/>
} <br/>
} <br/>
}
Source: https://habr.com/ru/post/100081/
All Articles