Android5.0多种侧滑栏效果实例代码

时间:2021-05-21

1.普通侧滑

效果图:

思路:通过自定义View继承HorizontalScrollView,然后重写onMeasure(),onLayout(),onTouchEvent()

方法并设置menu(通过动画使menu开始时处于隐藏状态)布局和content布局。(注意:使用ViewHelper类需要导入nineoldandroids-2.4.0.jar包)

menu(left_menu)布局代码:

<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"android:layout_centerInParent="true"><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/id_img1"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:layout_centerVertical="true"android:src="@mipmap/img_1"/><TextViewandroid:id="@+id/iv_text"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第一个item"android:textSize="21sp"android:textColor="#ffffff"android:layout_toRightOf="@+id/id_img1"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/></RelativeLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/id_img2"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:layout_centerVertical="true"android:src="@mipmap/img_2"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第二个item"android:textSize="21sp"android:textColor="#ffffff"android:layout_toRightOf="@+id/id_img2"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/></RelativeLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/id_img3"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:layout_centerVertical="true"android:src="@mipmap/img_3"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第三个item"android:textSize="21sp"android:textColor="#ffffff"android:layout_toRightOf="@+id/id_img3"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/></RelativeLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/id_img4"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:layout_centerVertical="true"android:src="@mipmap/img_4"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第四个item"android:textSize="21sp"android:textColor="#ffffff"android:layout_toRightOf="@+id/id_img4"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/></RelativeLayout><RelativeLayoutandroid:layout_width="fill_parent"android:layout_height="wrap_content"><ImageViewandroid:id="@+id/id_img5"android:layout_width="50dp"android:layout_height="50dp"android:layout_marginLeft="20dp"android:layout_marginTop="20dp"android:layout_centerVertical="true"android:src="@mipmap/img_5"/><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="第五个item"android:textSize="21sp"android:textColor="#ffffff"android:layout_toRightOf="@+id/id_img5"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/></RelativeLayout></LinearLayout></RelativeLayout>

content(activity_main)布局代码:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:hyname="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@mipmap/img_frame_background"><com.imooc.view.SlidingMenuandroid:id="@+id/id_menu"android:layout_width="match_parent"android:layout_height="match_parent"hyname:rightPadding="100dp"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="horizontal"><include layout="@layout/left_menu"/><LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"android:background="@mipmap/qq"><Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="切换菜单"android:onClick="toogleMenu"android:textSize="21sp"/></LinearLayout></LinearLayout></com.imooc.view.SlidingMenu></LinearLayout>

自定义attr.xml文件代码:

<?xml version="1.0" encoding="utf-8"?><resources><attr name="rightPadding" format="dimension"/><declare-styleable name="SlidingMenu"><attr name="rightPadding"></attr></declare-styleable></resources>

自定义SlidingMenu代码:

public class SlidingMenu extends HorizontalScrollView {private LinearLayout mWapper;private ViewGroup mMenu;//菜单布局private ViewGroup mContent;//内容布局private int mScreenWidth;//屏幕宽度private int mMenuRightPadding=50;private boolean once;private int mMenuWidth;private boolean isOpen;public SlidingMenu(Context context) {this(context, null);}/*** 未使用自定义属性时,调用* @param context* @param attrs*/public SlidingMenu(Context context, AttributeSet attrs) {this(context, attrs,0);}/*** 自定义了属性且使用时,调用次构造方法* @param context* @param attrs* @param defStyleAttr*/public SlidingMenu(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);//获取定义的属性的数组TypedArray typedValue=context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyleAttr, 0);int n=typedValue.getIndexCount();for (int i=0;i<n;i++){int attr=typedValue.getIndex(i);switch (attr){case R.styleable.SlidingMenu_rightPadding:mMenuRightPadding=typedValue.getDimensionPixelSize(attr,(int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()));break;}}typedValue.recycle();WindowManager mg= (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);//初始化屏幕信息对象DisplayMetrics outMetrics=new DisplayMetrics();//把屏幕的信息存储到DisplayMetrics中mg.getDefaultDisplay().getMetrics(outMetrics);//获取屏幕宽度赋值给mScreenWidthmScreenWidth=outMetrics.widthPixels;}/*** 设置子view的宽和高* 设置自己的宽和高* @param widthMeasureSpec* @param heightMeasureSpec*/@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if(!once){//获取SlidingMenu中的Linearlayout布局mWapper= (LinearLayout) getChildAt(0);//获取LinearLayout中的menu布局mMenu= (ViewGroup) mWapper.getChildAt(0);//获取LinearLayout中的Content布局mContent= (ViewGroup) mWapper.getChildAt(1);//获取menu宽度mMenuWidth= mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding;//设置content的宽度mContent.getLayoutParams().width=mScreenWidth;mWapper.getLayoutParams().width=mScreenWidth;once=true;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}/*** 通过设置偏移量,将menu隐藏* @param changed* @param l* @param t* @param r* @param b*/@Overrideprotected 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);}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()){case MotionEvent.ACTION_UP://隐藏在左边的宽度int scrollX=getScrollX();if (scrollX>=mMenuWidth/2){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)return;this.smoothScrollTo(mMenuWidth,0);isOpen=false;}//切换菜单public void toggle(){if(isOpen){closeMenu();}else {openMenu();}}}

主文件代码:

public class MainActivity extends AppCompatActivity {private SlidingMenu mleftMenu;private TextView textView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mleftMenu= (SlidingMenu) findViewById(R.id.id_menu);textView= (TextView) findViewById(R.id.iv_text);//menu的第一个Item的点击事件,可不写textView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {mleftMenu.toggle();}});}public void toogleMenu(View view){mleftMenu.toggle();}}

2.抽屉式侧滑(一)

效果图:

思路:在原来的基础上,在自定义View文件中重写onScrollChanged()方法

添加代码:

/*** 滚动时发生* @param l* @param t* @param oldl* @param oldt*/@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);//调用属性动画,设置TranslateX,l值为menu隐藏的宽度,menu由完全隐藏变为完全可见,变化梯度 scale由1~0,menu偏移量由大到小;float scale=l*1.0f/mMenuWidth; //1~0ViewHelper.setTranslationX(mMenu, mMenuWidth * scale);}

3.抽屉式侧滑(二)

效果图:

思路:在一的基础上通过设置menu的缩放效果,content的缩放效果和缩放中心实现。

实现代码:

/*** 滚动发生* @param l* @param t* @param oldl* @param oldt*/@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);//调用属性动画,设置TranslateX,l值为menu隐藏的宽度,menu由完全隐藏变为完全可见,变化梯度scale由1~0,menu偏移量由大到小;float scale=l*1.0f/mMenuWidth; //1~0// ViewHelper.setTranslationX(mMenu, mMenuWidth * scale);float leftScale=1.0f-scale*0.3f; //0.7~1.0float leftAlpha=0.6f+0.4f*(1-scale); //0.6~1.0float rightScale=0.7f+0.3f*scale; //1.0~0.7//缩放动画0.7~1.0ViewHelper.setScaleX(mMenu, leftScale);ViewHelper.setScaleY(mMenu, leftScale);//透明度变化0.6~1.0ViewHelper.setAlpha(mMenu, leftAlpha);ViewHelper.setTranslationX(mMenu, mMenuWidth * scale * 0.7f);ViewHelper.setPivotX(mContent, 0);ViewHelper.setPivotY(mContent, mContent.getHeight() / 2);//缩放动画1.0~0.7ViewHelper.setScaleX(mContent, rightScale);ViewHelper.setScaleY(mContent,rightScale);}

以上所述是小编给大家介绍的Android5.0多种侧滑栏效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章