рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдФрд░ рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЗ рдмреАрдЪ рд╕рдВрддреБрд▓рди рдмрдирд╛рдП рд░рдЦреЗрдВ

рдЫрд╡рд┐



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 рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЪрд▓ рд╕рдХрддрд╛ рд╣реИ:





рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, Google рдХреЛрдб рдкрд░ рдХрдкрдХреЗрдХ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдВред



рдЕрддрд┐рд░рд┐рдХреНрдд рдЬрд╛рдирдХрд╛рд░реА



рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ Froyo рд╕реЗ рдкрд╣рд▓реЗ рдЬрд╛рд░реА OSes рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рд░реНрдЧ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ ScaleGestureDetector рдХреЗрд╡рд▓ 2.2 рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реБрдЖред рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╕реБрдЭрд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдкрд░рдВрдкрд░рд╛рдЧрдд рд░реВрдк рд╕реЗ, рдПрдВрдбреНрд░реЙрдЗрдб рдлреЛрди рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЬреВрдо рдмрдЯрди рд╣реЛрддреЗ рд╣реИрдВред ZoomControls рдФрд░ ZoomButtonsController рдХреНрд▓рд╛рд╕реЗрд╕ рдЖрдкрдХреЛ рдЗрд╕ рд░рд╛рд╕реНрддреЗ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдВрдЧреЗред рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд╛рдардХ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрднреНрдпрд╛рд╕ рд╣реЛрдЧрд╛ред



All Articles