рд╣рд╛рдп рд╕рд╛рдерд┐рдпреЛрдВ!
рдЖрдЬ рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдХрд┐ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдмрдВрдзрдХ рдХреИрд╕реЗ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЬреАрд╡рди рдХреЛ рд╕рд╛рдВрд╕ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
рдбреЗрдЯрд╛рдЖрд░реНрдЯ рдореЗрдВ, рд╣рдореЗрдВ рдЕрдХреНрд╕рд░ рдЧреНрд░рд╛рд╣рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдХреБрдЫ рдЕрдиреБрднрд╡ рдкреНрд░рд╛рдкреНрдд рд╣реБрдЖ, рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рдкреИрдирд▓ рдХреЗ рдПрдХ рдПрдирд╛рд▓реЙрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рдЬреЛ рдЕрдХреНрд╕рд░ рдиреАрдЪреЗ рд╕реЗ рд╕рд╛рдорд╛рдЬрд┐рдХ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╣реЛрддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рд╕рд╛рдордЧреНрд░реА рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдлреЛрдЯреЛ, рдФрд░ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреИрдирд▓ рдкрд░ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝реЗрдВ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреАрдЪреЗ рд╕реЗ рдЦреАрдВрдЪ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореБрдЦреНрдп рд╕рд╛рдордЧреНрд░реА рдЖрдорддреМрд░ рдкрд░ рднреА рддреИрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЦреНрдп рдкреИрдирд▓ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рд╣реИред рдЗрд╕реЗ рд▓рдВрдмрди рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЦрд░реЛрдВрдЪ рд╕реЗ рдПрдХ рд╕рдорд╛рди рдШрдЯрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдореИрдВ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рдкреВрд░реНрдг, рд╕реНрдерд┐рд░ рдФрд░ рдЙрддреНрдкрд╛рджрди-рддреИрдпрд╛рд░ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмреБрдирд┐рдпрд╛рджреА рддрдХрдиреАрдХреЛрдВ рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░реНрдл рдПрдХ рдбреЗрдореЛ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
рдореМрдЬреВрджрд╛ рдШрдЯрдХ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд╡реНрдпреВрдЧреНрд░реБрдк рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдлреНрд░реЗрдорд▓реИрдЯ рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ред рдпрд╣ рдмреБрдирд┐рдпрд╛рджреА рджрд┐рдирдЪрд░реНрдпрд╛ рдХреА рдЪреАрдЬреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреЗрдЧрд╛, рдЬреИрд╕реЗ рдХрд┐ рдмрдЪреНрдЪреЛрдВ рдХреЛ рдорд╛рдкрдиреЗ, рд▓реЗрдЖрдЙрдЯ, рдЖрджрд┐, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рд╕рд╛рде рд╣рдорд╛рд░реЗ рдЙрджреНрдпрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
рддреЛ, рдХреНрд▓рд╛рд╕ рдбреНрд░реИрдЧрдмрд▓рдкреИрдирдиреЗрд▓ рд▓рдпрдЖрдЙрдЯ рдмрдирд╛рдПрдВред
рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рд╣реИ рддрд╛рдХрд┐ рд╢реАрд░реНрд╖ рдкрд░рдд рдиреАрдЪреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЬрд╛рдП рдФрд░ рдЗрд╕рдХрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╣рд┐рд╕реНрд╕рд╛ рдмрд╛рд╣рд░ рдЭрд╛рдБрдХреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдСрдирд▓рд╛рдЗрдЙрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:
@Override protected void onLayout(boolean changed, int left, int top, int right, int bottom) { super.onLayout(changed, left, top, right, bottom); if (getChildCount() != 2) { throw new IllegalStateException("DraggedPanelLayout must have 2 children!"); } bottomPanel = getChildAt(0); bottomPanel.layout(left, top, right, bottom - bottomPanelPeekHeight); slidingPanel = getChildAt(1); if (!opened) { int panelMeasuredHeight = slidingPanel.getMeasuredHeight(); slidingPanel.layout(left, bottom - bottomPanelPeekHeight, right, bottom - bottomPanelPeekHeight + panelMeasuredHeight); } }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИ: рд╣рдо рдЕрдкрдиреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рджреЛ рд╡рдВрд╢реЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХреЗред рдлрд┐рд░ рдКрдкрд░реА рд╡рдВрд╢ рдХреЛ рдордЬрдмреВрд░ рдХрд░реЗрдВ рдФрд░ рдиреАрдЪреЗ рд╕реЗ рдиреАрдЪреЗ рддрдХ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░реЗрдВред рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рддрд╛ рд╣реИ:
<com.dataart.animtest.DraggedPanelLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:dp="http://schemas.android.com/apk/res/com.dataart.animtest" android:layout_width="match_parent" android:layout_height="match_parent" dp:bottom_panel_height="64dp" tools:context=".MainActivity" > <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/stripes" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:contentDescription="@string/android" android:src="@drawable/android" /> </FrameLayout> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:text="@string/hello_world" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="@string/random_button" /> </FrameLayout> </com.dataart.animtest.DraggedPanelLayout>

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдиреАрдЪреЗ рдХрд╛ рдкреИрдирд▓ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдиреАрдЪреЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рд╣реЛ рдЧрдпрд╛ рд╣реИред рд╣рдореЗрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рд┐рдПред
рдПрдХ рдбреНрд░реИрдЧ рдФрд░ рдбреНрд░реЙрдк рдЬреЛрдбрд╝реЗрдВ
рдПрдХ рд╕реЙрдХреЗрдЯ рдХреЛ рдЙрдВрдЧрд▓реА рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдСрдирдЯрдЪрд╡реЗрдВрдЯ рд╡рд┐рдзрд┐ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдВ, рдЬрдм рд╣рдо рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рд╕реЗ рджрдмрд╛рддреЗ рд╣реИрдВ (ACTION_DOWN) рддреЛ рд╣рдореЗрдВ рдпрд╛рдж рд╣реЛрдЧрд╛ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдХрд╣рд╛рдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рд╣реИ, рдлрд┐рд░ рдПрдХ рдЙрдВрдЧрд▓реА (ACTION_MOVE) рдХреЗ рд╕рд╛рде, рд╣рдо рдЕрдкрдиреЗ рдкреИрдирд▓ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдЕрдВрдд рдореЗрдВ, ACTION_UP рдХреЗ рд╕рд╛рде, рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВрдЧреЗред рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рдо рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред
@Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { startDragging(event); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (touching) { float translation = event.getY() - touchY; translation = boundTranslation(translation); slidingPanel.setTranslationY(translation); bottomPanel .setTranslationY((float) (opened ? -(getMeasuredHeight() - bottomPanelPeekHeight - translation) * parallaxFactor : translation * parallaxFactor)); } } else if (event.getAction() == MotionEvent.ACTION_UP) { isBeingDragged = false; touching = false; } return true; }
рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рдмрд╛рдЙрдВрдбреНрд░реАрд▓реЗрд╢рди рд╡рд┐рдзрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рднреАрддрд░ рдПрдХ рдЙрдВрдЧрд▓реА рдХреЗ рд╕рд╛рде рдкреИрдирд▓ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рдкреНрд░рддрд┐рдмрдВрдзрд┐рдд рдХрд░рддреА рд╣реИ; рд╕реЗрдЯрдЯреНрд░рд╛рдВрд╕рд▓реЗрд╢рди рдСрдлрд╕реЗрдЯ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рдпрд╣рд╛рдВ рдореИрдВ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╡рд┐рд╖рдпрд╛рдВрддрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдЖрдЙрдЯ рдЖрдкрдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреА рд▓реЗрдЖрдЙрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд, рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП, рд╕реНрдХреНрд░реАрди рдкрд░ рдЗрд╕рдХрд╛ рдЖрдХрд╛рд░ рдФрд░ рд╕реНрдерд┐рддрд┐ рдкреБрдирд░рд╛рд╡рд░реНрддреА рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдирд╛ рдХрдард┐рди рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдорд╣рдВрдЧрд╛ рдСрдкрд░реЗрд╢рди рд╣реИред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдЖрдк рдХреЗрд╡рд▓ рдПрдХ рдордВрджреА рдПрдиреАрдореЗрд╢рди рдХрд╛ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗред рдЕрдиреБрд╡рд╛рдж рд╕рдВрдкрддреНрддрд┐, рдмрджрд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рд╕рдВрдкреВрд░реНрдг рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкрдж рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рддрддреНрд╡ рдХреА рд╕рд╕реНрддреА рдСрдлрд╕реЗрдЯ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рд╣реИред рдЕрдиреБрд╡рд╛рдж рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреГрд╢реНрдп рдореЗрдВ рд░реЛрдЯреЗрд╢рди, рд╕реНрдХреЗрд▓ рдЬреИрд╕реЗ рдЧреБрдг рд╣реИрдВред рд╡рд╛рдВрдЫрд┐рдд рдШрдЯрдХ рдХреЛ рдЙрдк-рд╡рд░реНрдЧ рдХрд░рдХреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдХреИрдирд╡рд╛рд╕ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд░реВрдкрд╛рдВрддрд░рдг рдХрд░рдирд╛ рднреА рд╕рдВрднрд╡ рд╣реИред рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг ListView рдПрдирд┐рдореЗрд╢рди рдкрд░ рдореЗрд░реЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдПрдХ рдмрд╛рд░ рдлрд┐рд░, рд▓реЗрдХрд┐рди рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдФрд░ рдХреИрдк рдореЗрдВред рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдирд┐рдпрдо
рдЙрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ !!!рдЗрд╢рд╛рд░реЗ рдХрд╛ рдкреВрд░рд╛ рд╣реЛрдирд╛
рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдЕрдкрдиреЗ рдкреИрдирд▓ рдХреЛ рдЕрдкрдиреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдЖрдЧреЗ рдмрдврд╝рд╛рдпрд╛ рдЬрд╛рдП, рдЕрдм рд╣рдореЗрдВ рдЗрд╢рд╛рд░реЗ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реНрдХ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗ:
- рдпрджрд┐ рдкреИрдирд▓ рдХреА рдЧрддрд┐ рдХрд╛рдлреА рдЕрдзрд┐рдХ рд╣реИ - рдкреИрдирд▓ рдХреЛ рдЕрдВрдд рддрдХ рд▓рд╛рдПрдВ рдФрд░ рдШрдЯрдХ рдХреЛ рд╡рд┐рдкрд░реАрдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд░рдЦреЗрдВред
- рдпрджрд┐ рдЧрддрд┐ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рдЖрдзреА рджреВрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреИрдирд▓ рдЦреАрдВрдЪрд╛ рд╣реИред рдпрджрд┐ рдРрд╕рд╛ рд╣реИ, рддреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧрддрд┐ рд╕реЗ рдбреНрд░рд╛рдЗрд╡рд┐рдВрдЧ рдЬрд╛рд░реА рд░рдЦреЗрдВ, рдЕрдиреНрдпрдерд╛, рдкреИрдирд▓ рдХреЛ рдЕрдкрдиреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрд╛рдПрдВред
public void finishAnimateToFinalPosition(float velocityY) { final boolean flinging = Math.abs(velocityY) > 0.5; boolean opening; float distY; long duration; if (flinging) { opening = velocityY < 0; distY = calculateDistance(opening); duration = Math.abs(Math.round(distY / velocityY)); animatePanel(opening, distY, duration); } else { boolean halfway = Math.abs(slidingPanel.getTranslationY()) >= (getMeasuredHeight() - bottomPanelPeekHeight) / 2; opening = opened ? !halfway : halfway; distY = calculateDistance(opening); duration = Math.round(300 * (double) Math.abs((double) slidingPanel.getTranslationY()) / (double) (getMeasuredHeight() - bottomPanelPeekHeight)); } animatePanel(opening, distY, duration); }
рдЙрдкрд░реЛрдХреНрдд рд╡рд┐рдзрд┐ рдЗрд╕ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИред рдЧрддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдХреНрд▓рд╛рд╕ рд╡реЗрд▓реЛрд╕рд┐рдЯреАрдЯреНрд░реИрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдЕрдВрдд рдореЗрдВ, рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреВрд░рд╛ рдХрд░реЗрдВ:
public void animatePanel(final boolean opening, float distY, long duration) { ObjectAnimator slidingPanelAnimator = ObjectAnimator.ofFloat(slidingPanel, View.TRANSLATION_Y, slidingPanel.getTranslationY(), slidingPanel.getTranslationY() + distY); ObjectAnimator bottomPanelAnimator = ObjectAnimator.ofFloat(bottomPanel, View.TRANSLATION_Y, bottomPanel.getTranslationY(), bottomPanel.getTranslationY() + (float) (distY * parallaxFactor)); AnimatorSet set = new AnimatorSet(); set.playTogether(slidingPanelAnimator, bottomPanelAnimator); set.setDuration(duration); set.setInterpolator(sDecelerator); set.addListener(new MyAnimListener(opening)); set.start(); }
рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рд╣рдо рдПрдХ рдирдП рд░рд╛рдЬреНрдп рдореЗрдВ рдШрдЯрдХ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рдСрдлрд╕реЗрдЯ рдХреЛ рд╢реВрдиреНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
@Override public void onAnimationEnd(Animator animation) { setOpenedState(opening); bottomPanel.setTranslationY(0); slidingPanel.setTranslationY(0); requestLayout(); }
рдЕрдиреНрдп рддрддреНрд╡реЛрдВ рд╕реЗ рдЯрдЪ'рдП рдХрд╛ рдЕрд╡рд░реЛрдзрди
рдЕрдм, рдпрджрд┐ рд╣рдо рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкреИрдирд▓ рдкрд░ рдПрдХ рдмрдЯрди рд▓рдЧрд╛рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рд╕реЗ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдкреИрдирд▓ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░ рдкрд╛рдПрдВрдЧреЗред рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдорд╛рд░рд╛ рдкреИрдирд▓ рдЧрддрд┐рд╣реАрди рд░рд╣реЗрдЧрд╛ред рдЗрд╕рдХреА рд╡рдЬрд╣ рд╣реИ рдмрдЯрди
рдкреИрдирд▓ рдХреЗ рдкрд╛рд╕ "рдИрд╡реЗрдВрдЯ" рдХреЛ рд╕реНрдкрд░реНрд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИред
рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдШрдЯрдирд╛ рдХреЛ рд░реЛрдХрдирд╛ рд╣реИ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкреИрдирд▓ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдФрд░ рди рдХреЗрд╡рд▓ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ, рдФрд░ рдмрдЯрди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рд░рдЦреЗрдВ, рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдХреИрдкреНрдЪрд░ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рджреГрд╢реНрдп рдореЗрдВ рдПрдХ OnInceptceptTouchEvent рд╡рд┐рдзрд┐ рд╣реИред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХрд╛ рддрд░реНрдХ рдФрд░ onTouchEvent рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдмрд╣реБрдд рд╣реА nontrivial рд╣реИ, рд▓реЗрдХрд┐рди рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред
@Override public boolean onInterceptTouchEvent(MotionEvent event) { if (event.getAction() == MotionEvent.ACTION_DOWN) { touchY = event.getY(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) { if (Math.abs(touchY - event.getY()) > touchSlop) { isBeingDragged = true; startDragging(event); } } else if (event.getAction() == MotionEvent.ACTION_UP) { isBeingDragged = false; } return isBeingDragged; }
рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗ рд╕рдЪ рд▓реМрдЯрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд (рдЯрдЪрд╕реНрд▓реЛрдк) рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИ (рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╣рдордиреЗ рдирд┐рдпрдВрддреНрд░рдг рд▓реЗ рд▓рд┐рдпрд╛ рд╣реИ)ред
рд╣реЛ рдЧрдпрд╛, рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдкреИрдирд▓ рдХреЛ рдХрд╣реАрдВ рднреА рд▓реЗ рдЬрд╛рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрдЯрди рдмрд╕ рдХреНрд▓рд┐рдХ рдХреЛ рдкрдВрдЬреАрдХреГрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди ACTION_CANCEL рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рд╕рдорд╛рдкрди
рдпрд╣ рд▓реЗрдЦ рдПрдирд┐рдореЗрдЯреЗрдб рдорд╛рд░реНрдХрдЕрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдПрдХ рдкреВрд░реНрдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░рдХреЛрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╡рд░реНрдгрд┐рдд рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ, рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред
рд╕рднреА рдШрдЯрдХ рд╕реНрд░реЛрдд
рдЧрд┐рдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдЖрд▓реЗрдЦ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╡рд░реНрдгрди рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдпрд╣ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ:
- рдкреИрдирд▓реЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рдЫрд╛рдпрд╛ рдЦреАрдВрдЪрдирд╛;
- рдХрд╕реНрдЯрдо рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ;
- рдПрдиреАрдореЗрд╢рди рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред
рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред