How to flexibly use ActionBar, Google music ActionBar to hide and display effects, and googleactionbar
The history of ActionBar is not introduced here. I believe everyone knows it. In an app, if ActionBar is used well, it will save a lot of code, and the effect of the entire app is quite good, if you are interested, you can download the google music app. The interface looks quite comfortable. OK. Here we will teach you a quick and convenient way to use ActionBar.
I still remember an alternative implementation of the custom style in the blog Android AlertDialog dialog box I wrote. That's right. Here we will use the method mentioned in that blog.
public int getIdentifier(String name, String defType, String defPackage) { if (name == null) { throw new NullPointerException("name is null"); } try { return Integer.parseInt(name); } catch (Exception e) { // Ignore } return mAssets.getResourceIdentifier(name, defType, defPackage); }
You will not be unfamiliar with this!
However, this method requires you to know the id of the ActionBar control. Here I will tell you that it is "action_bar_container"
<android.support.v7.internal.widget.ActionBarContainer android:id="@+id/action_bar_container" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignParentTop="true" style="?attr/actionBarStyle" android:touchscreenBlocksFocus="true" android:gravity="top"> <android.support.v7.widget.Toolbar android:id="@+id/action_bar" android:layout_width="match_parent" android:layout_height="wrap_content" app:navigationContentDescription="@string/abc_action_bar_up_description" style="?attr/toolbarStyle"/>
It is easy to find.
Therefore, we can easily obtain the ActionBar View.
The Code is as follows:
private View getActionBarView(){ View view = getWindow().getDecorView() ; int actionBarId = getResources().getIdentifier("action_bar_container","id",getPackageName()) ; return view.findViewById(actionBarId) ; }
What can we do after we get the View? Let's look at the two figures:
The ActionBar color is changed and the angle is rotated along the X axis.
This... Vertical ActionBar. See it for the first time!
Through the above two pictures, I just want to explain that, with the View of the ActionBar, We can flexibly control the ActionBar, such as the display and hiding effects of Google Music, next let's take a look at how to implement it.
First look at the dynamic diagram:
This effect is that when the RecyclerView slides up the ActionBar, The ActionBar is hidden and the moving distance of the ActionBar is controlled as the sliding distance.
Code is very simple
@ Override public void onScrolled (RecyclerView recyclerView, int dx, int dy) {super. onScrolled (recyclerView, dx, dy); int transY = (int) (mActionBarView. getTranslationY ()-dy); // The moving distance of the ActionBar cannot exceed the boundary transY = (int) clamp (transY,-mActionBarHeight, 0); mActionBarView. setTranslationY (transY );}
However, after the animation is released, another animation needs to be processed. If the display height of the ActionBar is half that of the height of the ActionBar, the animation is used to show all the animations. Otherwise, the animation is hidden.
@Overridepublic void onScrollStateChanged(RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE){ checkAnimation() ; }}
private void checkAnimation(){ int transY = (int)mActionBarView.getTranslationY(); if (transY != 0|| transY != -mActionBarHeight){ startAnimation() ; }}private void startAnimation(){ float [] value = new float[2] ; value[0] = mActionBarView.getTranslationY(); if (value[0] > -mActionBarHeight/2.0f){ value[1] = 0 ; }else { value[1] = - mActionBarHeight ; } ObjectAnimator animator =ObjectAnimator.ofFloat(MainActivity.this,"transY",value) ; animator.setDuration(150) ; animator.start();}
Here we mainly deal with animation and translation. If you are not familiar with it, you can download the source code and analyze it.
Summary:
The following method is used to obtain the View of the ActionBar:
public int getIdentifier(String name, String defType, String defPackage)
You need to know the name of the AcitonBar resource id. You can view the source code.
Source code: I am the code