Android SlideMenu source code analysis and user manual, androidslidemenu
Android SlideMenu source code analysis and User Manual
Let's first look at the usage:
First
Public class MainActivity extends SlidingFragmentActivity
Inherit from SlidingFragmentActivity, where slidemenu and other required data are created.
Add in Oncreate
Private void init_sm (){
Sm = getSlidingMenu (); // obtain the menu
Sm. setMode (SlidingMenu. LEFT_RIGHT); // It is set to either left or right.
Sm. setTouchModeAbove (sjavasingmenu. TOUCHMODE_FULLSCREEN); // set it to full screen on the right.
Sm. setTouchModeBehind (SlidingMenu. TOUCHMODE_MARGIN); // set it to the left border mode.
SetBehindContentView (R. layout. slidingmenu_left); // left layout
Sm. setSecondaryMenu (R. layout. slidingmeun_right); // right layout
Sm. setRightBehindWidth (MyApplication) getApplication ())
. GetScreenWidth (); // use this to layout the right side to full screen
}
The parameter TOUCHMODE_FULLSCREEN is described in detail here. After this parameter is set, the layout on the right side cannot respond to the sliding message, because full-screen messages are processed by slidemenu.
Therefore, we need to modify it as follows:
Sm. addIgnoredView (mPager );
Use this method to ignore the message clicked to mPager view.
After ignore is set, you need to use setOnTouchListener to receive the touch screen response message by yourself.
MPager. setOnTouchListener (new OnTouchListener (){
Private float startx =-1, starty =-1, OffsetWidth;
Private boolean hasdown = false;
@ Override
Public boolean onTouch (View v, MotionEvent event ){
Int action = event. getAction ();
Boolean returns = false;
If (action = MotionEvent. ACTION_DOWN ){
Startx = event. getX ();
Starty = event. getY ();
Hasdown = true;
} Else if (action = MotionEvent. ACTION_UP
| Action = MotionEvent. ACTION_CANCEL
| Action = MotionEvent. ACTION_MASK ){
Float x = event. getX ();
Float y = event. getY ();
Float xdiff = Math. abs (x-startx );
Float ydiff = Math. abs (y-starty );
If (! (-1 = startx &-1 = starty )){
If (OffsetWidth <1)
OffsetWidth = (float) (MyApplication
. GetApplication (). GetScreenWidth () * 0.15 );
If (hasdown & xdiff & gt; ydiff * 2.2
& Xdiff> OffsetWidth ){
If (x> startx )//
{
If (currIndex = 0 ){
Sm. toggle ();
}
Returns = false;
} // Else if (startx> x )//
//{
// If (currIndex = length-1
//&&! Sm. isSecondaryMenuShowing ())
// Sm. showSecondaryMenu ();
//}
}
}
Hasdown = false;
Startx = starty =-1;
}
Return returns;
}
});
The current practice is
If (currIndex = 0 ){
Sm. toggle ();
}
Use this to exit the sidebar. There is a menu on the left, simple layout, and viewpage on the right. Therefore, when sliding to the far left side, the page will be moved out to enter the main interface.
ShowMenu and showSecondaryMenu
Pay attention to these points in use.
The xml file of mainactivity is:
<FrameLayout xmlns: android = "http://schemas.android.com/apk/res/android"
Xmlns: tools = "http://schemas.android.com/tools"
Android: layout_width = "match_parent"
Android: layout_height = "match_parent"
Tools: context = "com. example. atemp. MainActivity"
Tools: ignore = "MergeRootFrame">
<FrameLayout
Android: id = "@ + id/container"
Android: layout_width = "match_parent"
Android: layout_height = "match_parent">
</FrameLayout>
</FrameLayout>
The Code adds the iner to the layout:
FragmentTransaction t = this. getSupportFragmentManager ()
. BeginTransaction ();
CenterFragment = new SampleListFragment ();
CenterFragment. setcontext (MainActivity. this );
T. add (R. id. container, centerFragment );
T. commit ();
-------------------------
Next we will analyze the source code:
First, because we inherit the public class MainActivity extends SlidingFragmentActivity, we should first study this SlidingFragmentActivity
View the oncreate Function
MHelper = new SlidingActivityHelper (this );
MHelper. onCreate (savedInstanceState );
This is a key attribute, and many subsequent interfaces are processed through it. For example
Public SlidingMenu getSlidingMenu (){
Return mHelper. getSlidingMenu ();
}
So let's take a look at the SlidingActivityHelper class.
Check mHelper. onCreate (savedInstanceState); this function
Public void onCreate (Bundle savedInstanceState ){
MSlidingMenu = (SlidingMenu) LayoutInflater. from (mActivity). inflate (R. layout. slidingmenumain, null );
}
Key property object created
R. layout. slidingmenumain content:
<? Xml version = "1.0" encoding = "UTF-8"?>
<Com. jeremyfeinstein. slidingmenu. lib. SlidingMenu xmlns: android = "http://schemas.android.com/apk/res/android"
Android: id = "@ + id/slidingmenumain"
Android: layout_width = "fill_parent"
Android: layout_height = "fill_parent"/>
So slidingMenu appears.
Key second function:
OnPostCreate
Method:
MSlidingMenu. attachToActivity (mActivity,
MEnableSlide? SlidingMenu. SLIDING_WINDOW: SlidingMenu. SLIDING_CONTENT );
Mount yourself to the Root view of the activity
Take a look at this section:
Case SLIDING_CONTENT:
MActionbarOverlay = actionbarOverlay;
// Take the above view out
ViewGroup contentParent = (ViewGroup) activity. findViewById (android. R. id. content );
View content = contentParent. getChildAt (0 );
ContentParent. removeView (content );
ContentParent. addView (this );
SetContent (content );
// Save people from having transparent backgrounds
If (content. getBackground () = null)
Content. setBackgroundResource (background );
Break;
The processing logic here is:
ContentParent. addView (this );
Add slidemenu to the contentview and use setContent (content) as the context of the current activity.
In this way, the slidemenu will be added to the main interface.
Then the message will be sent to CustomViewAbove. java and CustomViewBehind. java both inherit the viewgroup, so you can add several more views.
Because slideingMenu adds mViewAbove to the backend, it has the right to give priority to message response. Then, according to setContent (content);, set the layout with slidemenu,
The top message is sent to it.
The onInterceptTouchEvent and onTouchEvent of CustomViewAbove process various types of messages. In this way, the left and right sidebar functions are implemented.
The container Touch screen process on the main interface is: it will be passed to Touch up dispatch to com. jeremyfeinstein. slidingmenu. lib. CustomViewAbove only when no response is returned.