标签: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