Android之仿QQ的侧滑菜单
来源:互联网 发布:java中吸收回车符 编辑:程序博客网 时间:2024/05/30 04:04
我个人挺喜欢qq的这个侧滑,觉得是一个亮点,而且现在的版本更是突出了这个特点,特别的自然。我们就自己来尝试一下,
还是老样子,我会把代码都贴出来,希望你们看的开心。奈何我不会贴图片,所以就不展示结果了,你们可以把代码拿去自己运行看看结果,一定会很漂亮,哈哈,自卖自夸。
其实这个自然还是需要自定义一个view
主页面很简单就一个button,但是要把菜单的布局也引进来
<com.dwtedx.slidingmenu.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:zhy="http://schemas.android.com/apk/res/com.dwtedx.slidingmenu"
android:id="@+id/id_menu"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:scrollbars="none"
zhy:rightPadding="100dp" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<include layout="@layout/layout_menu" />
<LinearLayout
android:background="#ff0000"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="4dp"
android:paddingLeft="10dp"
android:onClick="toggleMenu"
android:textColor="@android:color/white"
android:textSize="17dp"
android:text="点我" />
</LinearLayout>
</LinearLayout>
</com.dwtedx.slidingmenu.SlidingMenu>
侧滑菜单就是条目,你可以写一些textview,imageview都可以,这是无所谓的,那么这个我就不再贴出来。
下面直接就是自定义的slidingmenu,注释都在里面
public class SlidingMenu extends HorizontalScrollView
{
/**
* 屏幕宽度
*/
private int mScreenWidth;
/**
* dp
*/
private int mMenuRightPadding;
/**
* 菜单的宽度
*/
private int mMenuWidth;
private int mHalfMenuWidth;
private boolean isOpen;
private boolean once;
private ViewGroup mMenu;
private ViewGroup mContent;
public SlidingMenu(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public SlidingMenu(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
mScreenWidth = this.getScreenWidth(context);
TypedArray a = context.getTheme().obtainStyledAttributes(attrs,
R.styleable.SlidingMenu, defStyle, 0);
int n = a.getIndexCount();
for (int i = 0; i < n; i++)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.SlidingMenu_rightPadding:
// 默认50
mMenuRightPadding = a.getDimensionPixelSize(attr,
(int) TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 50f,
getResources().getDisplayMetrics()));// 默认为10DP
break;
}
}
a.recycle();
}
public SlidingMenu(Context context)
{
this(context, null, 0);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
/**
* 显示的设置一个宽度
*/
if (!once)
{
LinearLayout wrapper = (LinearLayout) getChildAt(0);
mMenu = (ViewGroup) wrapper.getChildAt(0);
mContent = (ViewGroup) wrapper.getChildAt(1);
mMenuWidth = mScreenWidth - mMenuRightPadding;
mHalfMenuWidth = mMenuWidth / 2;
mMenu.getLayoutParams().width = mMenuWidth;
mContent.getLayoutParams().width = mScreenWidth;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@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);
once = true;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev)
{
int action = ev.getAction();
switch (action)
{
// Up时,进行判断,如果显示区域大于菜单宽度一半则完全显示,否则隐藏
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
if (scrollX > mHalfMenuWidth)
{
this.smoothScrollTo(mMenuWidth, 0);
isOpen = false;
} else
{
this.smoothScrollTo(0, 0);
isOpen = true;
}
return true;
}
return super.onTouchEvent(ev);
}
/**
* 打开菜单
*/
public void openMenu()
{
if (isOpen)
return;
this.smoothScrollTo(0, 0);
isOpen = true;
}
/**
* 关闭菜单
*/
public void closeMenu()
{
if (isOpen)
{
this.smoothScrollTo(mMenuWidth, 0);
isOpen = false;
}
}
/**
* 切换菜单状态
*/
public void toggle()
{
if (isOpen)
{
closeMenu();
} else
{
openMenu();
}
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
super.onScrollChanged(l, t, oldl, oldt);
float scale = l * 1.0f / mMenuWidth;
float leftScale = 1 - 0.3f * scale;
float rightScale = 0.8f + scale * 0.2f;
ViewHelper.setScaleX(mMenu, leftScale);
ViewHelper.setScaleY(mMenu, leftScale);
ViewHelper.setAlpha(mMenu, 0.6f + 0.4f * (1 - scale));
ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.7f);
ViewHelper.setPivotX(mContent, 0);
ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);
ViewHelper.setScaleX(mContent, rightScale);
ViewHelper.setScaleY(mContent, rightScale);
}
/**
* 获得屏幕高度
*
* @param context
* @return
*/
public int getScreenWidth(Context context)
{
WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
return outMetrics.widthPixels;
}
}
最后一步就是在主avtivity中调用
public class MainActivity extends Activity
{
private SlidingMenu mMenu;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
mMenu = (SlidingMenu) findViewById(R.id.id_menu);
}
public void toggleMenu(View view)
{
mMenu.toggle();
}
}
好了,这个侧滑菜单就实现了,除了自定义view会难一点,那些布局,以及在主activity中操作都so easy。相信你看了我的代码也会写出来,加油。
^-^ ^-^ ^-^
- Android之仿QQ的侧滑菜单
- Android自定义View之仿QQ侧滑菜单实现
- Android仿QQ侧滑菜单
- Android 仿QQ侧滑菜单
- Android仿QQ侧滑菜单小红点的实现
- 仿QQ侧滑菜单
- 仿QQ侧滑菜单
- 仿 qq 侧滑菜单
- 仿QQ侧滑菜单
- 仿QQ侧滑菜单
- 仿QQ侧滑菜单
- 仿QQ侧滑菜单
- 自定义view 之 仿QQ侧滑菜单
- android DrawerLayout实现仿QQ侧滑菜单
- Android 仿qq侧拉菜单
- Android学习之仿QQ侧滑功能的实现
- 利用HorizontalScrollView实现仿QQ的侧滑菜单
- 仿qq最新侧滑菜单
- PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)
- centos下mysql数据库编码问题详解
- Cocos2d-x游戏引擎开发[6]---定时器(Schedule)
- c++11 跨平台多线程demo和qt 静态链接
- GridControl自定义合并单元格 多个条件同时满足
- Android之仿QQ的侧滑菜单
- Curl用法点滴
- Python-OpenCV 处理图像(三):图像像素点操作
- RISC和CISC比较
- 集合:接口List
- 欢迎使用CSDN-markdown编辑器
- android Glide 获取磁盘缓存
- 大数(加减乘除)
- Java基础总结