作为新手,对于侧滑菜单的使用,当然也是用最简单的实现方式。
一样的,首先来讲一下侧滑菜单的原理,其实很简单,就是关于屏幕的触碰事件,监听手指的移动来判断是显示菜单栏还是显示主页面,所以只需要在主页面横着放两个布局(一个菜单布局和一个主页面布局)即可,然后进行判断!
好了多的就不说了,上代码首先是主页面的布局文件activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/main_linear_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="center">
<TextView
style="@style/text"
android:text="右边菜单"/>
</LinearLayout>
<LinearLayout
android:id="@+id/main_linear_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
style="@style/text"
android:text="主页面"/>
</LinearLayout>
</LinearLayout>
关于上面的style="@style/text"也贴出来供大家参考吧,其实大家完全可以自己写的,这个大家应该会的
<style name="text">
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:textColor">@color/red</item>
<item name="android:textSize">18dp</item>
</style>
最后便是重点了,主页面的滑动监听是显示主页面还是菜单页面,代码注释写的还算比较清楚就不多咯嗦了,大家看代码,有什么不懂的可以留言,有我时间会为大家解决的
public class MainActivity extends BaseActivity {
public int screenWidth;//屏幕的宽度
public int leftEdge;//左边菜单的左边距
/**
* menu布局的参数,通过此参数来更改leftMargin的值。
*/
private LinearLayout.LayoutParams menuParams;
public float xDown;//手指按下的横坐标
public float xMove;//手指移动的横坐标
public float xup;//手指抬起的横坐标
private boolean isMenuVisible;
/**
* 用于计算手指滑动的速度。
*/
private VelocityTracker mVelocityTracker;
/**
* 滚动显示和隐藏menu时,手指滑动需要达到的速度。
*/
public static final int SNAP_VELOCITY = 200;
@InjectView(R.id.main_linear_menu)
LinearLayout mainLinearMenu;
@InjectView(R.id.main_linear_content)
LinearLayout mainLinearContent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
initValues();
/**
* 监听主页面的滑动页面
*/
mainLinearContent.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (mVelocityTracker == null) {
mVelocityTracker = VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
xDown = event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
xMove = event.getRawX();
if (isMenuVisible){
menuParams.leftMargin = (int)(xMove-xDown);
}else{
menuParams.leftMargin = leftEdge+(int)(xMove-xDown);
}
if(menuParams.leftMargin<leftEdge){
menuParams.leftMargin=leftEdge;
}else if(menuParams.leftMargin>0){
menuParams.leftMargin = 0;
}
mainLinearMenu.setLayoutParams(menuParams);
break;
case MotionEvent.ACTION_UP:
xup = event.getRawX();
if(wantToShowMenu()){
if(shouldShowMenu()){
scrollToMenu();
}else{
scrollToContent();
}
}else if(wantToShowContent()){
if(shouldShowContent()){
scrollToContent();
}else{
scrollToMenu();
}
}
recycleVelocityTracker();
break;
}
return true;
}
});
}
//是否想去显示左边菜单
public boolean wantToShowMenu(){
return xup-xDown>0&&!isMenuVisible;
}
//是否能够显示左边菜单
public boolean shouldShowMenu(){
return xup-xDown>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY;
}
//滑动显示左边菜单
public void scrollToMenu(){
new ScrollTask().execute(30);
}
//是否想去显示主页面
public boolean wantToShowContent(){
return xup-xDown<0&&isMenuVisible;
}
//是否能够显示主页面
public boolean shouldShowContent(){
return xDown-xup+80>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY;
}
//滑动显示主页面
public void scrollToContent(){
new ScrollTask().execute(-30);
}
//滑动的速度
public int getScrollVelocity(){
mVelocityTracker.computeCurrentVelocity(1000);
return Math.abs((int)mVelocityTracker.getXVelocity());
}
/**
* 回收VelocityTracker对象。
*/
private void recycleVelocityTracker() {
mVelocityTracker.recycle();
mVelocityTracker = null;
}
class ScrollTask extends AsyncTask<Integer,Integer,Integer>{
@Override
protected Integer doInBackground(Integer... params) {
int leftMargin = menuParams.leftMargin;
while (true){
leftMargin+=params[0];
if(leftMargin>0){
leftMargin = 0;
break;
}
if(leftMargin<leftEdge){
leftMargin = leftEdge;
break;
}
publishProgress(leftMargin);
try {
Thread.sleep(20);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
if (params[0] > 0) {
isMenuVisible = true;
} else {
isMenuVisible = false;
}
return leftMargin;
}
@Override
protected void onProgressUpdate(Integer... leftMargin) {
menuParams.leftMargin = leftMargin[0];
mainLinearMenu.setLayoutParams(menuParams);
}
@Override
protected void onPostExecute(Integer leftMargin) {
menuParams.leftMargin = leftMargin;
mainLinearMenu.setLayoutParams(menuParams);
}
}
/**
* 初始化一些关键性数据。包括获取屏幕的宽度,给content布局重新设置宽度,给menu布局重新设置宽度和偏移距离等。
*/
private void initValues() {
screenWidth = getWindowManager().getDefaultDisplay().getWidth();//获取屏幕宽度
menuParams = (LinearLayout.LayoutParams)mainLinearMenu.getLayoutParams();//获取左边菜单的父容器
menuParams.width = screenWidth-80;
leftEdge = -menuParams.width;
menuParams.leftMargin = leftEdge;
mainLinearContent.getLayoutParams().width = screenWidth;
}
这样侧滑菜单就实现了,如果有什么不懂的可以留言,我有时间会一一为大家做出解释的,如果对你有所帮助,请点个赞,谢谢!