您的位置:首页 > 移动开发 > Android开发

Android抽屉效果(使用LayoutParams来移动View的位置)

2013-12-27 15:57 471 查看
package com.siyehuazhilian.masterslider;

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.LinearLayout;

public class MainActivity extends Activity {
private LinearLayout menuLayout, contentLayout;
private LinearLayout.LayoutParams menuLayoutParams, contentLayoutParams;

// 左边缘
private int leftEdge;

// 滑动因子
private boolean speedFlag = true;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 菜单栏
menuLayout = (LinearLayout) findViewById(R.id.menu);
// 内容栏
contentLayout = (LinearLayout) findViewById(R.id.content);

// 得到父控件
menuLayoutParams = (LinearLayout.LayoutParams) menuLayout
.getLayoutParams();
contentLayoutParams = (LinearLayout.LayoutParams) contentLayout
.getLayoutParams();

WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
int width = windowManager.getDefaultDisplay().getWidth();
// 菜单栏隐藏起来.内容栏设置为0内容栏必须设置,否则无法随菜单栏的移动而移动,会被压缩或拉伸
leftEdge = menuLayoutParams.width = width - 80;
menuLayoutParams.leftMargin = -menuLayoutParams.width;
contentLayoutParams.width = width;
contentLayoutParams.leftMargin = 0;
}

private int startX;
private int distance;

@Override
public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = (int) event.getRawX();
break;
case MotionEvent.ACTION_MOVE:
if (speedFlag) {// 每10毫秒次响应一次移动
// 计算手指移动的距离
distance = (int) ((event.getRawX() - startX) / 5);

// 如果手指移动的距离加上menu左边距的大小没有超过屏幕且大于初始的位置,就移动它
if (menuLayoutParams.leftMargin + distance <= 0
&& menuLayoutParams.leftMargin + distance > -leftEdge) {
menuLayoutParams.leftMargin += distance;
menuLayout.setLayoutParams(menuLayoutParams);
}
speedFlag = false;
} else {
controlspeed();
}
break;
case MotionEvent.ACTION_UP:
// 手指离开时,判断移动的宽度,如果大于一半,就显示出来,否则隐藏
if (leftEdge - -menuLayoutParams.leftMargin > leftEdge / 2) {
menuLayoutParams.leftMargin = 0;
} else {
menuLayoutParams.leftMargin = -leftEdge;
}
menuLayout.setLayoutParams(menuLayoutParams);
break;

default:
break;

}
return true;
}

private void controlspeed() {
try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}
speedFlag = true;
}
}

//源码分享
//http://pan.baidu.com/s/1o6mBPHo
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐