设为首页 加入收藏

TOP

Android 高仿QQ HD mini左右滑动菜单栏效果(一)
2014-11-24 07:20:51 来源: 作者: 【 】 浏览:5
Tags:Android 高仿 mini 左右 滑动 菜单 效果

1.进入程序时,首先显示中间菜单,即QQHD mini的最近会话列表。


Android 高仿QQ HD mini左右滑动菜单栏效果


2.向左滑动,或者点击左上角图标,可以展开左边菜单栏,即QQ HD mini的好友列表,有动画效果。


Android 高仿QQ HD mini左右滑动菜单栏效果


3.向右滑动或者点击右上角图标,可以展开右边菜单,即QQ HD mini的设置之类的布局,这里我放了一个自定义view,作为例子。


Android 高仿QQ HD mini左右滑动菜单栏效果


下面让我们来看看最重要的那个自定义view的源码:


/**
* 可左右切换菜单栏的LinearLayout
*
* @author way
*
*/
public class CenterLayout extends LinearLayout {


private final static String TAG = "CenterLayout";


public static final int LEFT = 0x001;// 当前显示左菜单栏


public static final int RIGHT = 0x002;// 当前显示右菜单栏


public static final int MIDDLE = 0x000;// 当前显示中间主界面


private int mCurState = MIDDLE;// 当前显示的view


public final int MENU_border_Width = 50;// 边栏宽度


private Scroller mScroller;


private LinearLayout leftLayout, rightLayout, childLayout;


private Context context;


private boolean fling;


private boolean mIsBeingDragged = false;


private int mTouchSlop;
/**
* Position of the last motion event.
*/
private float mLastMotionX, mLastMotionY;


/**
* ID of the active pointer. This is used to retain consistency during
* drags/flings if multiple pointers are used.
*/
private int mActivePointerId = INVALID_POINTER;


/**
* Sentinel value for no current active pointer. Used by
* {@link #mActivePointerId}.
*/
private static final int INVALID_POINTER = -1;


int menuWidth = 0;
int moveWidth = 0;


// 3个构造器
public CenterLayout(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}


public CenterLayout(Context context) {
super(context);
initView(context);
}


public Scroller getScroller() {
return mScroller;
}


// 初始化view
public void initView(Context context) {
this.context = context;
this.menuWidth = MENU_border_Width;
this.mScroller = new Scroller(context, AnimationUtils.loadInterpolator(
context, android.R.anim.overshoot_interpolator));


final ViewConfiguration configuration = ViewConfiguration.get(context);
mTouchSlop = configuration.getScaledTouchSlop();
mCurState = MIDDLE;// 初始化默认状态
}


/**
* 获取屏幕宽度
*
* @param context
* @return
*/
private int getViewWidthInPix(Context context) {
int viewWidthInPix = -1;
if (viewWidthInPix == -1) {
WindowManager manager = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
viewWidthInPix = manager.getDefaultDisplay().getWidth();
}
return viewWidthInPix;
}


@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);


for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
child.layout(child.getLeft() + moveWidth, child.getTop(),
child.getRight() + moveWidth, child.getBottom());
}


}


@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(), 0);
postInvalidate();
}
}


@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
// TODO Auto-generated method stub
// Log.i(TAG, "onInterceptTouchEvent------>" + ev.getAction());
final int action = ev.getAction();
if ((action == MotionEvent.ACTION_MOVE) && (mIsBeingDragged)) {
return true;// 拦截不传递给child view
}


switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = ev.getX();
final float y = ev.getY();
if (!inChild((int) x, (int) y)) {
mIsBeingDragged = false;
break;
// 超出边界,return false传递给子view处理
}


/*
* Remember location of down touch. ACTION_DOWN always refers to
* pointer index 0.
*/
mLastMotionX = x;
mLastMotionY = y;
mActivePointerId = ev.getPointerId(0);


/*
* If being flinged and user touches the screen, initiate drag;
* otherwise don't. mScroller.isFinished should be false when being
* fli

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇用 Qt4 Designer 配合程序设计 下一篇C++ 命名管道 IPC

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·Java 学习线路图是怎 (2025-12-25 15:19:15)
·关于 Java 学习,有 (2025-12-25 15:19:12)
·有没有Java swing教 (2025-12-25 15:19:09)
·Start, Stop, and Di (2025-12-25 14:50:57)
·C语言入门教程:零基 (2025-12-25 14:50:54)