Android开发之初级开发之侧滑效果的实现(二)
在:http://www.cnblogs.com/devil-angele/articles/4042272.html
我们已经能成功的实现侧滑效果了,

但是我们现在要实现红色箭头这宽度的大小,我们又该怎么办呢?
这时,我们就要用到了自定义属性这个了。
第一步,我们需要在values文件夹下,新建一个xml文件:attr.xml
<?xml version="1.0" encoding="utf-8"?> <resources> <!-- dimension:支持 dp sp px等 --> <attr name="rightPadding" format="dimension"></attr> <declare-styleable name="SlidingMenu"> <attr name="rightPadding"></attr> </declare-styleable> </resources>
第二步,需要我们到布局文件去自定义自己的命名空间,格式: xmlns:hql(空间名字)="http://schemas.android.com/apk/res/+com.hql.slidingmenu(当前应用包名)"
第三步,如图 设置rightPadding

第四步,修改源代码
SlidingMenu.java
package com.hql.slidingmenu.myview; import com.hql.slidingmenu.R; import android.content.Context; import android.content.res.TypedArray; 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; // 单位:dp private int mMenuRightPadding = 50; private boolean once = false; private int mMenuWidth; public SlidingMenu(Context context) { this(context, null); } // 当自定义属性时,使用了调用此方法 public SlidingMenu(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // 获取自定义属性 TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu, defStyle, 0); int num = array.getIndexCount(); for (int i = 0; i < num; i++) { int attr = array.getIndex(i); switch (attr) { case R.styleable.SlidingMenu_rightPadding: mMenuRightPadding = array.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics())); break; } } // 释放 array.recycle(); // 获取屏幕宽度 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics metrics = new DisplayMetrics(); wm.getDefaultDisplay().getMetrics(metrics); mScreenWidth = metrics.widthPixels; } // 未自定义属性的时候调用 public SlidingMenu(Context context, AttributeSet attrs) { this(context, attrs, 0); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (!once) { mWapper = (LinearLayout) getChildAt(0); mMenu = (ViewGroup) mWapper.getChildAt(0); mContent = (ViewGroup) mWapper.getChildAt(1); // 设置menu的宽度 mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding; // 设置content宽度 mContent.getLayoutParams().width = mScreenWidth; once = true; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } // 通过设置偏移量,隐藏或者显示空间 protected void onLayout(boolean changed, int l, int t, int r, int b) { super.onLayout(changed, l, t, r, b); // 隐藏menu this.scrollTo(mMenuWidth, 0); } public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_UP: int scroll = getScrollX(); if (scroll >= mScreenWidth / 2) { this.smoothScrollTo(mMenuWidth, 0); } else { this.smoothScrollTo(0, 0); } return true; } return super.onTouchEvent(ev); } }

浙公网安备 33010602011771号