首页 > 其他分享 >Android高仿网易新闻客户端之侧滑菜单

Android高仿网易新闻客户端之侧滑菜单

时间:2022-12-06 10:00:50浏览次数:62  
标签:int private public 高仿 context import Android android 客户端


承接上一篇文章:​​Android高仿网易新闻客户端之动态添加标签​​,今天实现侧滑菜单的效果。

关于侧滑菜单,有很多种实现方式:

1. 自定义ViewGroup 请参考:​​Android实现网易新闻客户端侧滑菜单(二)​​

2. 使用第三方开源框架 请参考​​:Android实现网易新闻客户端侧滑菜单(一)​​

今天用第三种方法,自定义HorizontalScrollView,相比较自定义ViewGroup来说,不需要处理ACTION_MOVE事件了,更简单。

SlidingMenu.java

package com.jackie.neteasenews.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

import com.jackie.neteasenews.R;

/**
* Created by Jackie on 2016/1/8.
* 侧滑菜单
*/
public class SlidingMenu extends HorizontalScrollView {
private LinearLayout mWrapperLayout;
private ViewGroup mMenuView;
private ViewGroup mMainView;

private int mScreenWidth;
private int mMenuWidth;
private int mMenuPaddingRight;

private boolean mIsOnce = false;

public SlidingMenu(Context context) {
this(context, null);
}

public SlidingMenu(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);

mScreenWidth = context.getResources().getDisplayMetrics().widthPixels;
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.SlidingMenu);
mMenuPaddingRight = ta.getDimensionPixelSize(R.styleable.SlidingMenu_paddingRight, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 50, context.getResources().getDisplayMetrics()));
ta.recycle();
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (!mIsOnce) {
mWrapperLayout = (LinearLayout) getChildAt(0);
mMenuView = (ViewGroup) mWrapperLayout.getChildAt(0);
mMainView = (ViewGroup) mWrapperLayout.getChildAt(1);
mMenuView.getLayoutParams().width = mMenuWidth = mScreenWidth - mMenuPaddingRight;
mMainView.getLayoutParams().width = mScreenWidth;
mIsOnce = true;
}

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) {
scrollTo(mMenuWidth, 0);
}
}

@Override
public boolean onTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_UP:
if (getScrollX() > mMenuWidth / 2) {
scrollTo(mMenuWidth, 0);
} else {
scrollTo(0, 0);
}
return true;
}
return super.onTouchEvent(ev);
}
}

其中还用到了自定义属性,定义菜单距屏幕的右边距,自定义属性的用法,这里不作介绍,大家可以看代码。


activity_content.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:jackie="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >

<com.jackie.neteasenews.view.SlidingMenu
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
jackie:paddingRight="200px">

<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">

<include layout="@layout/activity_menu"/>
<include layout="@layout/activity_main"/>

</LinearLayout>
</com.jackie.neteasenews.view.SlidingMenu>
</LinearLayout>

由于我仿网易客户端的时候用到了ViewPager,滑动事件与侧滑菜单有冲突,所以,我自定义ViewPager将滑动事件禁用掉了。

CustomViewPager.java

package com.jackie.neteasenews.view;

import android.content.Context;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.MotionEvent;

/**
* Created by Jackie on 2016/1/8.
* 提供禁止滑动的接口
*/
public class CustomViewPager extends ViewPager {

private boolean mIsPagingEnabled = true;

public CustomViewPager(Context context) {
this(context, null);
}

public CustomViewPager(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
return mIsPagingEnabled && super.onTouchEvent(event);
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
return mIsPagingEnabled && super.onInterceptTouchEvent(event);
}

public void setIsPagingEnabled(boolean isPagingEnabled) {
this.mIsPagingEnabled = isPagingEnabled;
}
}

然后调用setIsPagingEnable(false)就OK了。

效果图如下:

Android高仿网易新闻客户端之侧滑菜单_Android网易侧滑菜单

附上代码地址:

​https://github.com/shineflower/NeteaseNews.git​

标签:int,private,public,高仿,context,import,Android,android,客户端
From: https://blog.51cto.com/u_11407799/5914593

相关文章

  • Android 自定义标题栏Title Bar
    在Android自定义标题栏,步骤很简单:1.在onCreate方法中声明如下代码:requestWindowFeature(Window.FEATURE_CUSTOM_TITLE);setContentView(R.id.activity_main);getWindow().......
  • 获取客户端信息测试
    MicrosoftWindows[版本10.0.19044.1766](c)MicrosoftCorporation。保留所有权利。(env)E:\pyAPP\Madking>pipinstallWMICollectingWMIDownloadingWMI-1.5.1-p......
  • 《“透视”个人大数据》项目开发小记 --(三)Android APP 开发(1)技术经验总结
       项目的AndroidAPP应用软件经过不断实践改进,技术上已逐渐成熟,这为进一步的提升及新项目的开发奠定了基础。开发过程中积累的一些技术和经验将渐次的与同行分享。......
  • Java网络编程---基于TCP协议实现客户端服务端通信
    首先,对于TCP协议,我们要明确:TCP:传输控制协议TCP会尽自己所能,尽量将数据发送给对方;但并不能保证100%可以发送给对方TCP会在数据发送不到对方的情况下,会给应用......
  • android开发内存泄漏分析步骤总结
    思路:复现泄漏步骤,dumphprof文件,用MAT工具分析大对象的引用链。操作步骤:1、adbshell进入Android系统2、amdumpheap[进程名]/data/local/tmp/temp.hprof3、另起......
  • Android实现图片的倒影效果
    原理:原图和倒影图分解成两个Bitmap,倒影的Bitmap设计为原图的高度一半,宽度一致。然后创建一个可变空的Bitmap,宽度跟原图保持一致,宽度为原图的1.5倍(宽度包括原图和倒影图......
  • Android基础面试题
    1. 转屏时候Activity的生命周期1.1新建一个Activity,并把各个生命周期打印出来1.2运行Activity,得到如下信息onCreate-->onStart-->onResume-->1.3按crtl+f12切换成横屏......
  • Android实现水波纹外扩效果
    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束。现在简单来实现这样的一个动画功能......
  • Android Location服务之Geocoder
    提到Android基于位置的服务,就不得不提android.location包,location包提供了很便捷的API来实现基于位置的服务。主要包括Geocoder和LocationManager。今天就先来介绍一下Geoco......
  • Android Activity
    Activity的四种状态  Activity的生命周期  eg:打开MainActivity.java ,  继承Activity单击鼠标右键产生菜单项(Generate),之后选择重写方法菜单项(Overri......