
Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬреЛ рд╕рднреА рдЬрд╛рд░реА рдХрд┐рдП рдЧрдП рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рд╡рд┐рдХрд╛рд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдд рд╣реИрдВ, рд╕рдВрднрд╡рддрдГ рдЗрд╕ рдпреЛрдЬрдирд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ:

1 рдЬреБрд▓рд╛рдИ 2010 рдХреЛ, рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб рд╕рдВрд╕реНрдХрд░рдг рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рдЖрдВрдХрдбрд╝рд╛ рдерд╛ред рдПрдВрдбреНрд░реЙрдЗрдб рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд╕рд╛рде, рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рд╕реЛрдЪрдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛: рдирдП рд╕рдВрд╕реНрдХрд░рдг рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдирдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛, рдпрд╛ рдЗрд╕реЗ рдпрдерд╛рд╕рдВрднрд╡ рдЕрдзрд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдирд╛ред
рдЕрдиреБрднрд╡реА рдбреЗрд╡рд▓рдкрд░реНрд╕ рдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдпреЗ рджреЛ рд╡рд┐рдХрд▓реНрдк рдкрд╛рд░рд╕реНрдкрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдирдиреНрдп рд╣реИрдВ, рдФрд░ рдЙрдирдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦрдирд╛ рджрд░реНрджрдирд╛рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реИред
рдХреБрдЫ рд╕рдкреНрддрд╛рд╣ рдкрд╣рд▓реЗ, рд╣рдорд╛рд░реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдЬрд╛рдВрдЪ рдХреА рдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб 2.0 (рдИрдХреНрд▓реЗрдпрд░) рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдорд▓реНрдЯреАрдЯрдЪ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИ, рдЕрдВрдд рдореЗрдВ рдПрдХ рд╕рд░рд▓ рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдпрд╣ рдПрдВрдбреНрд░реЙрдЗрдб 1.5 рддрдХ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░реЗред рдЖрдк
Google рдХреЛрдб рдкрд░ рдкреБрд░рд╛рдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рдХрдЯ рдореЗрдВ рдореБрджреНрджреЗ
AndroidManifest.xml рдореЗрдВ рдЙрдкрдпреЛрдЧ-
sdk рдЯреИрдЧ рдХреЛ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
minSdkVersion рдФрд░
targetSdkVersion ред рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЖрдк рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдпрд╣ рдирдП рд▓реЛрдЧреЛрдВ рдкрд░ рднреА рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдм рдЖрдк рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдирдП рдПрд╕рдбреАрдХреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рд╕реАрдзреЗ рдирдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдЖрдк рд╕рд┐рд╕реНрдЯрдо рд▓реЙрдЧ рдореЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ:
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)
рд╣рдордиреЗ рдЧрд▓рдд рддрд░реАрдХреЗ рд╕реЗ
minSdkVersion рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рдпрд╣рд╛рдБ рдпрд╣ рдкрд░рд┐рдгрд╛рдо рд╣реИред рд╣рдордиреЗ SDK 8 (Froyo) рдкрд░ рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди
minSdkVersion = тАЭ3тАЭ (рдХрдкрдХреЗрдХ) рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдЫреЛрдбрд╝рддреЗ рд╣реБрдП, рд╣рдордиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдмрддрд╛рдпрд╛ рдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЗрд░рд╛рджреЛрдВ рд╕реЗ рдЕрд╡рдЧрдд рдереЗ рдФрд░ рдЕрд╕рдВрднрд╡ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдкреВрдЫреЗрдВрдЧреЗред рдпрджрд┐ рд╣рдо рдЗрд╕реЗ рд╡реИрд╕реЗ рд╣реА рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ, рддреЛ рдПрд╕рдбреАрдХреЗ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╡рд╛рд▓реЗ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рдмрджрд╕реВрд░рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ред рдмреЗрд╢рдХ, рдирд╛рд░рд╛рдЬ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рднреАрдбрд╝ 1 рд╕реНрдЯрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЬрд╝рд╛рд░ рдореЗрдВ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рд░реЗрдЯ рдХрд░реЗрдЧреАред рдЗрд╕рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдХреНрд░реЛрдзрд┐рдд рдЬрд╛рдВрдЪ рдХреЗ рдмрд┐рдирд╛ рдирдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдкрд╣реБрдВрдЪ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдкрд░рд╛рд╡рд░реНрддрди рд╡рд┐рдзрд┐
рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рдкрд░рд╛рд╡рд░реНрддрди рдХреЛрдб рдХреЛ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдФрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рд▓рдХреНрд╖реНрдп рдХреЗ рддрд░реАрдХреЗ рдпрд╛ рдХрдХреНрд╖рд╛рдПрдВ рдореМрдЬреВрдж рд╣реИрдВ рдпрд╛ рдЙрдиреНрд╣реЗрдВ рдХреЙрд▓ рдХрд░реЗрдВ, рдпрд╛ рдЙрдиреНрд╣реЗрдВ рд╕реАрдзреЗ рд╕реНрдкрд░реНрд╢ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВред
рдЬрд╛рдирдмреВрдЭрдХрд░ рдпрд╛ рд╕рд╢рд░реНрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреНрдп рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рд╕реЗ рд╕реБрд╡рд┐рдзрд╛ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдЕрдЪреНрдЫреА рдирд╣реАрдВ рд╣реИред рдпрд╣ рдмрджрд╕реВрд░рдд рд╣реИред рдпрд╣ рдзреАрдорд╛ рд╣реИред рдпрд╣ рдмреЛрдЭрд┐рд▓ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдХреЛрдб рдореЗрдВ рдЗрд╕рдХрд╛ рднрд╛рд░реА рдЙрдкрдпреЛрдЧ рдЗрд╕реЗ рдЖрдЧреЗ рдХреЗ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдХрдЪрд░реЗ рдореЗрдВ рдмрджрд▓ рджреЗрдЧрд╛ред рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рдореИрдВ рдХрд╣рддрд╛ рд╣реВрдВ рдХрд┐ 2.2 (рдлрд╝реНрд░реЛрдпреЛ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдВрдбреНрд░реЙрдЗрдб 1.5 (рдХрдкрд░реЗрдХ) рдХреЗ рд▓рд┐рдП рдЙрдиреНрдореБрдЦ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИ, рдПрдХ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛?
рд╡рд┐рд▓рдВрдмрд┐рдд рд▓реЛрдбрд┐рдВрдЧ
рд░рд┐рд╕рд░реНрдЪрд░ рдмрд┐рд▓ рдкреБрдШ рдиреЗ ClassLoader рдЖрд▓рд╕реА рд▓реЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд╕рднреА рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рд╡рд╛ рдореЗрдВ рд╕рд┐рдВрдЧрд▓рдиреЗрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдкреНрд░рдХрд╛рд╢рд┐рдд рдФрд░ рд╡рд┐рддрд░рд┐рдд рдХреА рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛
рд╕рд╛рдордЧреНрд░реА ред рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
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/>
}
рдЙрдирдХреЗ рдХрд╛рдо рдХрд╛ рдПрдХ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИред рдЬрд╛рд╡рд╛ рдХреНрд▓рд╛рд╕реЗрд╕ рдХреЛ рдкрд╣рд▓реА рдкрд╣реБрдБрдЪ рдореЗрдВ рд▓реЛрдб рдФрд░ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдкрд╣рд▓реА рдмрд╛рд░ рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИ рдпрд╛ рд╡рд┐рдзрд┐ рдпрд╛ рдЗрд╕рдХреЗ рдХрд┐рд╕реА рдПрдХ рд╕реНрдЯреИрдЯрд┐рдХ рдлрд╝реАрд▓реНрдб рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рджреНрд╡рд╛рд░рд╛ рддрднреА рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╡реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рдирд╣реАрдВред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдмрд┐рдВрдм рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ Android рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╣реИред
рд╕рдВрдЧрддрддрд╛ рдбрд┐рдЬрд╛рдЗрди
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдпрд╣ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдиреАрдЪрд╛ рджрд┐рдЦрд╛рдП, рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╣рдЯрд╛рдП рдпрд╛ рд╡реИрдХрд▓реНрдкрд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░реЗред рдЪреВрдВрдХрд┐ рдПрдВрдбреНрд░реЙрдЗрдб рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗрд╡рд▓ рдПрдкреАрдЖрдИ рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдкрдХреЛ рд╕рдВрдЧрддрддрд╛ рдбрд┐рдЬрд╛рдЗрди рдХрд░рддреЗ рд╕рдордп рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдпрд╣ рд╕рдорд░реНрдерди рд╡рд┐рдХрд▓реНрдк рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рд╕рдВрд╕реНрдХрд░рдг-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдлрд╝рдВрдХреНрд╢рдВрд╕ рдпрд╛ рдЕрдореВрд░реНрдд рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╕реНрдХрд░рдг-рд╕рдВрд╡реЗрджрдирд╢реАрд▓ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдирдП рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдПрдХ рдЙрдкрд╡рд░реНрдЧ рдирдИ рдкреНрд░рдгрд╛рд▓реА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдЙрдкрд╡рд░реНрдЧ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХреЛрдВ рд╕реЗ рдЖрд╡реЗрджрди рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд▓рд╛рдирд╛
рдЗрд╕ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг 3 (рдХрдкрдХреЗрдХ) рд╕реЗ 8 рд╕рдВрд╕реНрдХрд░рдг (рдлреНрд░рд╛рдпреЛ) рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдмрдирд╛рдП рдЧрдП рдорд▓реНрдЯреА-рдЯрдЪ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░реЗрдВрдЧреЗред рдкрд╣рд▓реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдиреЛрдЯ рдХрд┐рдпрд╛ рдХрд┐
рдЧреЗрд╕реНрдЯреНрдпреВрд░реЗрдЯреЗрдЯрд░реНрд╕ рд╕реЗрдВрд╕рд░ рдЗрд╡реЗрдВрдЯ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рд╕рдВрджрд░реНрдн рд╣реИред рддрдм рдореБрдЭреЗ рд╕рдордЭ рдирд╣реАрдВ рдЖрдпрд╛ рдХрд┐ рдпрд╣ рдХрд┐рддрдиреА рдЬрд▓реНрджреА рд▓рд╛рдЧреВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рдбреЗрдореЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ
рд╕рдВрд╕реНрдХрд░рдг-рд╡рд┐рд╢рд┐рд╖реНрдЯ рддрддреНрд╡реЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЕрдореВрд░реНрдд
GestureDetector рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╣ рд╕рдм рд▓рд╛рдЧреВ рдХрд░
рд╕рдХрддреЗ рд╣реИрдВ ред
рдЖрд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ API-s 3 рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП
minSdkVersion рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдкреАрдЖрдИ рд╕рдВрд╕реНрдХрд░рдг 3 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рд╣рдо рдЕрднреА рднреА рд╕рдВрд╕реНрдХрд░рдг 8 рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдЖрдкрдХреЗ рдкреНрд░рдХрдЯ рд╣реЛрдиреЗ рдХреЗ
targetSdkVersion рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдм рд╣рдорд╛рд░реА рдЙрдкрд╕реНрдерд┐рддрд┐ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:
<?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 >
рд╣рдорд╛рд░рд╛
TouchExampleView рд╡рд░реНрдЧ
ScaleGestureDetector рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг Froyo рддрдХ рдПрдВрдбреНрд░реЙрдЗрдб рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ, рдФрд░ рдирдП
MotionEvent рдкрджреНрдзрддрд┐ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг Eclair рдХреЗ рдиреАрдЪреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИ рдЬреЛ рдорд▓реНрдЯреАрдЯрдЪ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИред рд╣рдореЗрдВ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЕрдореВрд░реНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдРрд╕реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд▓реЛрдб рдирд╣реАрдВ рд╣реЛрдВрдЧреЗ рдЬреЛ рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдпрд╛ рд╡рд░реНрдЧ рдмрдирд╛рдПрдВрдЧреЗ, рдЗрд╕реЗ
рд╡рд░реНрд╕реНрдбрдЧреНрд░реЗрдЪрд░рдбреЗрдХреНрдЯрд░ рдХрд╣реЗрдВрдЧреЗред
рд╕реИрдВрдкрд▓ рдПрдкреНрд▓реАрдХреЗрд╢рди рдореЗрдВ рдпреВрдЬрд░ рдХреЗ 2 рдЬреЗрд╕реНрдЪрд░, рдбреНрд░реИрдЧ рдФрд░ рд╕реНрдХреЗрд▓ рд╣реЛрддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП,
VersionedGestureDetector рдХреЛ рджреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:
onDrag рдФрд░
onScale ред
TouchExampleView рдХреЛ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЕрдиреБрд░реВрдк
рд╡рд░реНрд╕реНрдбрдЧреНрд░реЗрдЪрд░рдбреЗрдХреНрдЯрд░ рд╡рд░реНрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдлрд╝рд┐рд▓реНрдЯрд░ рдХрд░реЗрдВ, рдФрд░ рддрджрдиреБрд╕рд╛рд░
рдСрдирдбреНрд░реИрдЧ рдФрд░
рдСрдирд╕реНрдХреЗрд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВред
рдкрд╣рд▓рд╛
рд╕рдВрд╕реНрдХрд░рдгрдГ рд╕рдВрд╕реНрдХрд░рдгDDestureDetector рд╣реЛрдЧрд╛:
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/>
}
рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░
рдСрдирдбреНрд░реИрдЧ рдЗрд╡реЗрдВрдЯ рдХреЗ рдЖрдпреЛрдЬрди рдХрд╛ рдпрд╣ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдорд╛рди рдЬреЛ рд▓реЗрддрд╛ рд╣реИ рд╡рд╣ X рдХреЗ рд╕рд╛рде Y рдХреЗ рд╕рд╛рде рдкреЙрдЗрдВрдЯрд░ рджреНрд╡рд╛рд░рд╛ рддрдп рдХрд┐рдП рдЧрдП рдкрде рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрддрд╛ рд╣реИред
рдПрдХреНрд▓реЗрдпрд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╢реБрд░реВ, рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рд╕реЗ рджреВрд░ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд┐рдВрджреБрдУрдВ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
CupcakeDetector рдореЗрдВ рдореВрд▓
onTouchEvent рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реВрдЪрдХ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛ рддрд░рдХреАрдмреЛрдВ рдХреЗ рд╕рд╛рдеред рд╣рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
getActiveX рдФрд░
getActiveY рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рд╣реА рдкреЙрдЗрдВрдЯрд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
EclairDetector рдореЗрдВ рдкреБрдирд░реНрдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
<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/>
}
рдЕрдм
EclairDetector , рдирдП рддрд░реАрдХреЛрдВ
getActiveX рдФрд░
getActiveY рд╕реЗ рдЖрдЧреЗ рдирд┐рдХрд▓ рдЧрдпрд╛ ред рдЗрд╕ рдХреЛрдб рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЖрдкрдХреЛ рд▓реЗрдЦ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
<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/>
}
EclairDetector рд╕реВрдЪрдХ рдХреА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдХрд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж
super.onTouchEvent рдХрд╣рддрд╛ рд╣реИ, рдбреНрд░реИрдЧ рдИрд╡реЗрдВрдЯ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
CupcakeDetector рдЪрд▓рд╛рддрд╛ рд╣реИред рдорд▓реНрдЯреА-рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рдХрд╛ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдВрдд рдореЗрдВ, рдЖрдЗрдП рдПрдХ
ScaleGestureDetector рдЬреЛрдбрд╝реЗрдВ рдЬреЛ Froyo рдХреЗ рд▓рд┐рдП рдЬрд╝реВрдо рдЬреЗрд╕реНрдЪрд░ рд╕рдорд░реНрдерди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдЧрд╛ред рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рдЖрдВрджреЛрд▓рди рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
рдХрдкрдХреЗрдХрдбреЗрдХреНрдЯрд░ рдореЗрдВ рдХреБрдЫ рдмрджрд▓рд╛рд╡ рдХрд░рдиреЗ рд╣реЛрдВрдЧреЗред рдХреБрдЫ рдЯрдЪрд╕реНрдХреНрд░реАрди рдореЗрдВ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреА рд╕рдорд╕реНрдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдо
CupDakeDetector рдореЗрдВ
рдХрдВрдзреЗ рдХреА рд╡рд┐рдзрд┐
рдЬреЛрдбрд╝реЗрдВрдЧреЗ рдЬреЛ
onDrag рдШрдЯрдирд╛ рднреЗрдЬрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рдБрдЪ рдХрд░реЗрдЧрд╛ред
рдХрдкрдХреЗрдХрдбреЗрдХреНрдЯрд░ рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг:
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/>
}
EclairDetector рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд░рд╣рддрд╛ рд╣реИред рдиреАрдЪреЗ
FroyoDetector ред рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди
рдбреИрдбреНрд░реИрдЧ рдХреЛ рдПрдХ рд╕рдХрд╛рд░рд╛рддреНрдордХ рдореВрд▓реНрдп рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
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/>
}
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЬреЗрд╕реНрдЪрд░ рдбрд┐рдЯреЗрдХреНрдЯрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЦреЛрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЪрд▓реЛ рдПрдХ
VersionedGestureDetector рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВред
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/>
}
рдЪреВрдВрдХрд┐ рд╣рдо рдХрдкрдХреЗрдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА
Build.VERSION.SDK_INT рддрдХ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдореЗрдВ рдЕрдм рдЕрдкреНрд░рдЪрд▓рд┐рдд
Build.VERSION.SDK рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╣рдорд╛рд░рд╛
VersionedGestureDetector рддреИрдпрд╛рд░ рд╣реИ, рдЕрдм рд╣рдореЗрдВ рдЗрд╕реЗ
TouchExampleView рдХреЗ рд╕рд╛рде
рдорд┐рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ , рдЬреЛ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛ рдЧрдпрд╛ рд╣реИред
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/>
}
рдирд┐рд╖реНрдХрд░реНрд╖
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдирд╡реАрдирддрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдФрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмреЛрдВ рдХреЗ рдПрдХ рднреА рдЙрдкрдпреЛрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдВрдбреНрд░реЙрдЗрдб 1.5 рдкрд░ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ред рдЙрд╕реА рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдХрд┐рд╕реА рднреА рдирдИ Android рд╕реБрд╡рд┐рдзрд╛ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди Android рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ:
- ClassLoader рдХрдХреНрд╖рд╛рдУрдВ рдХреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЬрд╛рдБрдЪ рдХрд░ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
- рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ред
- рд░рдирдЯрд╛рдЗрдо рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рд╕рдВрд╕реНрдХрд░рдг-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред рдпрд╣ ClassLoader рдХреЛ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП,
Google рдХреЛрдб рдкрд░ рдХрдкрдХреЗрдХ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред
рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА
рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ Froyo рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд░реА OSes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рд░реНрдЧ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛,
рдХреНрдпреЛрдВрдХрд┐ ScaleGestureDetector рдХреЗрд╡рд▓ 2.2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реБрдЖред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╕реБрдЭрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЬреВрдо рдмрдЯрди рд╣реЛрддреЗ рд╣реИрдВред
ZoomControls рдФрд░
ZoomButtonsController рдХреНрд▓рд╛рд╕реЗрд╕ рдЖрдкрдХреЛ рдЗрд╕ рд░рд╛рд╕реНрддреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ред