QQ左侧滑动显示

QQ左侧滑动显示

对于新版的QQ界面,左侧增加了一个滑动效果,相信小伙伴们早已按耐不住激动的心情,这种效果是如何实现的呢?本篇我们就一起来探讨一二。既然是滑动效果这里就要使用到HorizontalScrollView类,一个水平滑动的效果。

对于这个效果我们可以分为一个Item Menu和Layout,通过对Item Menu设置padding值来隐藏和显示左侧的Menu菜单。

我们的Menu设计代码:

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/img_frame_background" >

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_centerInParent="true"

android:orientation="vertical">

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/img1"

android:layout_width="50dp"

android:layout_height="50dp"

android:src="@drawable/img_1"

android:layout_marginLeft="20dp"

android:layout_marginTop="20dp"

android:layout_centerVertical="true"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:textColor="#fff"

android:text="第一个item"

android:layout_toRightOf="@id/img1"

android:layout_centerVertical="true"

/>

android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/img2"

android:layout_width="50dp"

android:layout_height="50dp"

android:src="@drawable/img_2"

android:layout_marginLeft="20dp"

android:layout_marginTop="20dp"

android:layout_centerVertical="true"

/>

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_marginLeft="20dp"

android:textColor="#fff"

android:text="第二个item"

android:layout_toRightOf="@id/img2"

android:layout_centerVertical="true"

/>

我们的主Activity的Layout代码:

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin"

tools:context=".MainActivity" >

android:layout_width="match_parent"

android:layout_height="match_parent">

android:layout_width="wrap_content"

android:layout_height="match_parent"

android:orientation="horizontal"

>

android:layout_width="match_parent"

android:layout_height="match_parent"

android:background="@drawable/qq"

/>

我们自定义的SlidingMenu:

package com.example.menu;

import android.content.Context;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.util.TypedValue;

import android.view.MotionEvent;

import android.view.ViewGroup;

import android.view.WindowManager;

import android.widget.HorizontalScrollView;

import android.widget.LinearLayout;

public class SlidingMenu extends HorizontalScrollView {

private LinearLayout mWapper;

private ViewGroup mMenu;

private ViewGroup mContent;

private int mScreenWidth;//屏幕的宽度

private int mMenuWidth;//设置Menu的宽度

//dp

private int mMenuRightPadding;

private boolean once = false;

/**

* 未使用自定义属性时调用此方法

* @param context

* @param attrs

*/

public SlidingMenu(Context context, AttributeSet attrs) {

super(context, attrs);

WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);

DisplayMetrics outMetrics = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(outMetrics );

mScreenWidth = outMetrics.widthPixels;

//将dp转换为px

mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());

}

/**

* 设置内部View的宽和高,以及自己的宽和高

*/

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

if(!once){

mWapper = (LinearLayout) getChildAt(0);

mMenu = (ViewGroup) mWapper.getChildAt(0);

mContent = (ViewGroup) mWapper.getChildAt(1);

mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;

mContent.getLayoutParams().width = mScreenWidth;

once = true;

}

}

/**

* 设置子View的放置位置

* 通过设置偏移量来隐藏Menu

*/

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

if(changed){

this.scrollTo(mMenuWidth, 0);

}

}

/**

* 控制手指的滑动效果

*/

@Override

public boolean onTouchEvent(MotionEvent ev) {

int action = ev.getAction();

switch (action) {

case MotionEvent.ACTION_UP:

int scrollx = getScrollX();//Menu左侧隐藏的区域宽度

if(scrollx >= mMenuWidth/2){

this.smoothScrollTo(mMenuWidth, 0);

}else{

this.smoothScrollTo(0, 0);

}

return true;

}

return super.onTouchEvent(ev);

}

}

我们的主Activity:

public class MainActivity extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

requestWindowFeature(Window.FEATURE_NO_TITLE);//去除标题

setContentView(R.layout.activity_main);

}

}

效果图:

相关文章

Oclean X值不值得买 Oclean X上手体验及评测
28365365体育在线备用

Oclean X值不值得买 Oclean X上手体验及评测

07-17 1339
苹果11卡顿反应慢怎么解决
28365365体育在线备用

苹果11卡顿反应慢怎么解决

08-07 8470
秘鲁直播
365bet亚洲真人

秘鲁直播

07-04 2279
闻的解释
365bet亚洲真人

闻的解释

10-20 9614
华为手机闹钟铃声设置在哪里
365bet亚洲真人

华为手机闹钟铃声设置在哪里

08-21 1972
陶瓷啡咖杯
28365365体育在线备用

陶瓷啡咖杯

08-07 2408