活动布局:
Aty代码:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//*
*布局属性的动画测试
*本aty的布局最外层时为RelativeLayout
* bottom是线性布局,与动画的实现关系不大
*顶层是自定义的线性布局,它为动画复盖onTouchEvent事件
*顶层默认遮挡bottom
*
* @author vigiles
*/
publicclasshomeactivityextendsactivity {
@Override
protectedvoidoncreate (边界维护实例state )。
super.oncreate (savedinstancestate;
setcontentview (r.layout.activity _ main;
//bottom层按钮
findviewbyid(r.id.BTN ).setonclicklistener ) (newonclicklistener ) )。
@Override
公共语音在线(查看) {
toast.maketext (home activity.this,'基础控件响应:维吾尔博客',0 ).show );
}
);
//顶层按钮
findviewbyid(r.id.BTN2 ).setonclicklistener ) (newonclicklistener ) ) )。
@Override
公共语音在线(查看) {
toast.maketext (home activity.this,' top布局控件响应: cuiweiyou.com ',0 ).show );
}
);
}
}
侧滑班定制
根据速度判断,手指的滑动速度足够快,侧滑会立即执行。 使用velocity跟踪器速度跟踪器。 可以删除此功能。
onLayout () )
首先重写这个方法,主要目的是得到本布局的属性对象。
//**
*手指滑动时,系统将继续调用此方法并重新绘制此视图/界面/布局
*首次加载此布局时,将调用一次APP应用程序。 初始化属性实例非常重要。
* @param changed此布局的幻灯片/移动为true
* @param l相对于此布局左侧父容器左侧的位置,父容器左侧的左侧为负数
* @param r此布局相对于右侧父容器左端的位置
* @param t此布局上端相对于父容器上端的位置
* @param b此布局底边相对于父容器上边的位置
(//
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Override
protectedvoidonlayout (布尔更改,intl,intt,intr,intb ) {
super.onlayout (变更,l,t,r,b );
//位置移动后
if (已更改) {
//获取布局对象
内容参数=(relative layout.layout params ) this.getLayoutParams );
内容参数. width=content width;
setlayoutparams (内容参数;
}
}
onTouchEvent
然后是必须的重写touch事件。在其中根据手指的按下位置、滑动过程、拿起位置、滑动速度进行判断分析处理。
保存手指按下时marginLeft的值和手指的距离“dis”
保持手指滑动时和marginLeft的距离一直是“dis”
说起来比较绕,具体还是代码:
手指按下
Java
1
2
3
4
5
6
7
8
9
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
xDown=event.getRawX();
// 无论是否已经侧滑,这个得到的都是手指和本布局左边线的距离
paramsLeftMargin=(int)(xDown-contentParams.leftMargin);
paramsRightMargin=(int)(contentParams.leftMargin+xDown);
break;
手指滑动
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
caseMotionEvent.ACTION_MOVE:
xMove=event.getRawX();
intdistanceX=(int)(xMove-xDown);// 负数:向左滑,正数:向右滑
// 如果向左滑的
if(distanceX<=0){
// 如果已经滑开
if(isOpen){
// 手指滑动过程中的位置减去和边线的距离就是边线的目标位置。滑动中保持手指和边线距离不变
contentParams.leftMargin=(int)(xMove-paramsLeftMargin);
contentParams.rightMargin=(int)(xMove-paramsRightMargin);
// 如果向左滑的太多
if(contentParams.leftMargin<0){
contentParams.leftMargin=0;
contentParams.rightMargin=0;
}
}else{
contentParams.leftMargin=0;
contentParams.rightMargin=0;
}
setLayoutParams(contentParams);
}
// 如果向右滑动
elseif(distanceX>0){
// 如果尚未滑开
if(!isOpen){
contentParams.leftMargin=distanceX;// 负数,绝对值即向右移动的距离
contentParams.rightMargin=-distanceX;
// 如果移动太多
if(contentParams.leftMargin>contentWidth-300){
contentParams.leftMargin=contentWidth-300;
contentParams.rightMargin=2*contentWidth-300;
}
}else{
contentParams.leftMargin=contentWidth-300;
contentParams.rightMargin=2*contentWidth-300;
}
setLayoutParams(contentParams);
}
break;
手指拿起
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
caseMotionEvent.ACTION_UP:
xUp=event.getRawX();
intupDistanceX=(int)(xUp-xDown);// 手指拿起后相对于按下时的距离。正数:向右,负数:向左
if(Math.abs(upDistanceX)>=touchSlop){
// 如果手指是向右滑动的,布局还没滑开
if(upDistanceX>0&&!isOpen){
mVelocityTracker.computeCurrentVelocity(1000);// 计算1秒内速率
intvelocity=Math.abs((int)mVelocityTracker.getXVelocity());// x轴速度
// 如果滑动距离有效,或速度够快
if(upDistanceX>500||velocity>SNAP_VELOCITY){
// 向右移动,速度30像素
//new ScrollTask().execute(30); // TODO scrollTo
// 向右移动
contentParams.leftMargin=contentWidth-300;
contentParams.rightMargin=2*contentWidth-300;
setLayoutParams(contentParams);
isOpen=true;
}
// 如果
else{
// // 向左移动,速度30像素
// new ScrollTask().execute(-30);
contentParams.leftMargin=0;
contentParams.rightMargin=0;
setLayoutParams(contentParams);
}
}
elseif(upDistanceX<0&&isOpen){
mVelocityTracker.computeCurrentVelocity(1000);
intvelocity=Math.abs((int)mVelocityTracker.getXVelocity());
if(Math.abs(upDistanceX)>500||velocity>SNAP_VELOCITY){
// 向左移动,速度30像素
//new ScrollTask().execute(-30);
contentParams.leftMargin=0;
contentParams.rightMargin=0;
setLayoutParams(contentParams);
isOpen=false;
}
else{
// // 向右移动,速度30像素
// new ScrollTask().execute(30);
contentParams.leftMargin=contentWidth-300;
contentParams.rightMargin=2*contentWidth-300;
setLayoutParams(contentParams);
}
}
}
elseif(Math.abs(upDistanceX)
// 当手指按下向左滑又向右滑回来,不足以触发事件时
if(isOpen){
contentParams.leftMargin=contentWidth-300;
contentParams.rightMargin=2*contentWidth-300;
setLayoutParams(contentParams);
}else{
contentParams.leftMargin=0;
contentParams.rightMargin=0;
setLayoutParams(contentParams);
}
}
// 重置速度追踪器
mVelocityTracker.recycle();
mVelocityTracker=null;
break;
提供项目包:注意为了上传方便android-support-v4.jar删除了,导入后记得替换。同时重写build project。
[download id=”1672″]
承接App定制、企业web站点、办公系统软件 设计开发,外包项目,毕设