自定义侧滑菜单

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义侧滑菜单相关的知识,希望对你有一定的参考价值。

1.新建一个类继承linearlayout

package bawei.com.weijifen.base.diyview;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;

/**
* 作者:张宏达
* 类的创建时间: 2017/1/4 10:51
* 类的作用:封装的自定义侧滑菜单
*/

public class DiySlidingMemu extends LinearLayout {

LinearLayout ll_left;
LinearLayout ll_main;
boolean isClose = false;//判断现在状态是不是弹出 isClose false弹出 true 关闭
int left;//left 在第一次按下的时候获取左边距
boolean isfrist = false;//isfrist 判断是不是第一次 false 第一次 true 不是第一次
int x, y; //第一次按下的时候获取 x,y
int distancex;//在水平方向的位移
int distancey;//在竖直方向的位移


//实现的三个构造方法
public DiySlidingMemu(Context context) {
super(context);
}

public DiySlidingMemu(Context context, AttributeSet attrs) {
super(context, attrs);
}

public DiySlidingMemu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}


//定义的接受布局对象的方法
public void addrest(LinearLayout ll_left, LinearLayout ll_main) {
this.ll_left = ll_left;
this.ll_main = ll_main;
}

//控件的触摸监听
@Override
public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

if (isfrist == false) {

left = ll_left.getWidth() * (-1);
isfrist = true;
}

x = (int) event.getX();//点击点的横坐标
y = (int) event.getY();//点击点的纵坐标
break;
case MotionEvent.ACTION_MOVE:


distancex = (int) (event.getX() - x); //获取滑动过程中在水平方向的偏移量
distancey = (int) (event.getY() - y); //获取滑动过程中在竖直方向的偏移量


/*
* 判断滑动的方向
* 如果在水平方向的偏移量大于在竖直方向的偏移量则为水平滑动
* 如果在水平方向的偏移量小于在竖直方向的偏移量则为水平滑动
* distancex的值为正数则为向右滑动
* distancex的值为负数则为向左滑动
*/
if (Math.abs(distancex) > Math.abs(distancey)) {

if (distancex > 0) {//向右滑动

//向右移动的时候左视图的左边距一点一点的加在水平方向的位移量
left += distancex;

//左视图的左边距最大等于0,判断如果大于0,则赋值给0

if (left >= 0) {
left = 0;
}

} else {//向左滑动

//向左yidongshi移动时distancex的值为负数,也直接加即可
left += distancex;
//判断如果左视图的做边距距离大于视图的宽度,就直接赋值给宽度,不然会造成视图多移动进去
if (Math.abs(left) >= ll_left.getWidth()) { left = ll_left.getWidth() * (-1);
}
}
//调用侧滑菜单显示位置的方法
Left(left);
}
break;
case MotionEvent.ACTION_UP:

if (Math.abs(left) >= ll_left.getWidth() / 2){
isClose=true;
}
//调用侧滑菜单显示位置的方法
LeftIsClose();
break; }
//返回true 指onTouch事件直接消费
return true; }
//点击按钮直接弹出侧滑菜单的方法 在别的类调用此方法
public void LeftIsClose() {
if (isClose == false) {//弹出
Left(0);
isClose = true;
} else {//关闭
Left(-ll_left.getWidth());
isClose = false; } }
//菜单滑动左右偏移的逻辑
public void Left(int left) {
//左边布局的左边距设置距离
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) ll_left.getLayoutParams();
params.leftMargin = left;
ll_left.setLayoutParams(params);
//主布局的右边边距设置距离
LinearLayout.LayoutParams params1 = (LinearLayout.LayoutParams) ll_main.getLayoutParams();
params1.rightMargin = -(ll_left.getWidth() - Math.abs(left));
ll_main.setLayoutParams(params1); }
}


2.在主布局中创建两个视图,一个主视图一个左视图
3.调用


















以上是关于自定义侧滑菜单的主要内容,如果未能解决你的问题,请参考以下文章

Android自定义View之仿QQ侧滑菜单实现

android自定义ViewGroup(侧滑菜单)

自定义侧滑菜单

Android高仿网易新闻客户端之侧滑菜单

Android自定义ListView实现侧滑子菜单

HarmonyOS ArkUI之自定义组件侧滑菜单(JS)