码迷,mamicode.com
首页 > 其他好文 > 详细

自定义侧滑菜单

时间:2017-01-05 15:12:44      阅读:225      评论:0      收藏:0      [点我收藏+]

标签:rri   定义   自定义   getx   ide   super   getwidth   lin   xtend   

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.调用


















自定义侧滑菜单

标签:rri   定义   自定义   getx   ide   super   getwidth   lin   xtend   

原文地址:http://www.cnblogs.com/cvmen/p/6252382.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!