Crosscompatibility.rar
1.
Versionedgesturedetector.java
ImportAndroid.content.context;importAndroid.os.build;importAndroid.util.log;importAndroid.view.motionevent;importAndroid.view.scalegesturedetector;public Abstract classVersionedgesturedetector {private static final String TAG = "Versionedgesturedetector"; Ongesturelistener Mlistener; public staticVersionedgesturedetector newinstance (context context, Ongesturelistener Listener) {Final int sdkversion =Integer.parseint (Build.VERSION.SDK); Versionedgesturedetector detector = NULL; if (Sdkversion <Build.version_codes. Eclair) {detector = newCupcakedetector (); } else if (Sdkversion <Build.version_codes. FROYO) {detector = newEclairdetector (); } else{detector = newFroyodetector (context); } log.d (TAG, "Created new" +Detector.getclass ()); Detector.mlistener =Listener ReturnDetector } public Abstract BooleanOntouchevent (motionevent ev); public interfaceOngesturelistener {public void Ondrag (float dx, floatDY); public void Onscale (floatScalefactor); } private static Class Cupcakedetector extendsVersionedgesturedetector {FloatMlasttouchx; FloatMlasttouchy; FloatGetactivex (motionevent ev) {returnEv.getx (); } floatGetactivey (motionevent ev) {returnEv.gety (); } BooleanShoulddrag () {return true; } @Override Public BooleanOntouchevent (motionevent ev) {switch(Ev.getaction ()) {caseMotionevent.action_down: {Mlasttouchx =Getactivex (EV); Mlasttouchy =Getactivey (EV); Break; } caseMotionevent.action_move: {final float x =Getactivex (EV); Final float y =Getactivey (EV); If(Shoulddrag ()) {Mlistener.ondrag (X-mlasttouchx, Y-Mlasttouchy); } Mlasttouchx =X Mlasttouchy =Y Break; }} return True; }} private static class Eclairdetector extendsCupcakedetector {private static final int invalid_pointer_id =-1; private int Mactivepointerid =invalid_pointer_id; private int mactivepointerindex = 0; @Override floatGetactivex (motionevent ev) {returnEv.getx (Mactivepointerindex); } @Override FloatGetactivey (motionevent ev) {returnEv.gety (Mactivepointerindex); } @Override Public BooleanOntouchevent (motionevent ev) {final int action =Ev.getaction (); Switch (Action &Motionevent.action_mask) {caseMotionEvent.ACTION_DOWN:mActivePointerId = Ev.getpointerid (0); Break; CaseMotionEvent.ACTION_CANCEL:caseMotionEvent.ACTION_UP:mActivePointerId =invalid_pointer_id; Break; CaseMotionEvent.ACTION_POINTER_UP:final int pointerindex = (ev.getaction () &Motionevent.action_pointer_index_mask) >>Motionevent.action_pointer_index_shift; Final int pointerid =Ev.getpointerid (Pointerindex); if (Pointerid = =Mactivepointerid) {//This is our active pointer going up. Choose a new//active pointer and adjust accordingly. Final int newpointerindex = Pointerindex = = 0? 1:0; Mactivepointerid =Ev.getpointerid (Newpointerindex); Mlasttouchx =Ev.getx (newpointerindex); mlasttouchy = ev.gety (newpointerindex);} break;} Mactivepointerindex = Ev.findpointerindex (Mactivepointerid); Return Super. ontouchevent (EV);}} private static class Froyodetector extends eclairdetector {private scalegesturedetector mdetector; public Fr Oyodetector (Context context) {Mdetector = new scalegesturedetector (context, new Scalegesturedetector.simpleonscalegesturelistener () {@Override public boolean Onscale (scalegesturedetector Detector) {Mlistener.onscale (Detector.getscalefactor ()); return true;}}); } @Override Boolean Shoulddrag () {return! Mdetector.isinprogress (); } @Override public boolean ontouchevent (motionevent ev) {mdetector.ontouchevent (EV); return Super. Ontouchevent (EV); } }}
2.
Touchexampleview.java
ImportAndroid.content.context;importAndroid.graphics.canvas;importAndroid.graphics.drawable.drawable;importAndroid.util.attributeset;importAndroid.view.motionevent;importAndroid.view.view;public class Touchexampleview extendsView {PrivateDrawable Micon; Private floatMPOSX; Private floatMposy; PrivateVersionedgesturedetector Mdetector; private float Mscalefactor = 1. F; PublicTouchexampleview (Context context) {This (context, NULL, 0); } publicTouchexampleview (context context, AttributeSet Attrs) {This (context, attrs, 0); } public Touchexampleview (context context, AttributeSet attrs, intDefstyle) {Super(Context, attrs, Defstyle); Micon = Context.getresources (). getdrawable (R.drawable.icon); Micon.setbounds (0, 0, Micon.getintrinsicwidth (), Micon.getintrinsicheight ()); Mdetector = versionedgesturedetector.newinstance (context, new gesturecallback ());} @Override public Boolean ontouchevent (motionevent ev) {mdetector.ontouchevent (EV); return true ;} @Override public void OnDraw (Canvas canvas) {Super . OnDraw (canvas); Canvas.save (); Canvas.translate (Mposx, Mposy); Canvas.scale (Mscalefactor, Mscalefactor ); Micon.draw (canvas); Canvas.restore (); } Private class Gesturecallback implements Versionedgesturedetector.ongesturelistener {public void Ondrag (float DX, float dy) {mposx + = dx; mposy + = dy; invalidate (); public void Onscale (float scalefactor) { Mscalefactor *= scalefactor;//Don ' t let the object get too small or too large. Mscalefactor = Math.max (0.1f, Math . Min (Mscalefactor, 5.0f )); Invalidate (); } }}
Android simple case: a removable view