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);
    }

}

 

posted @ 2014-10-22 10:33  loneliness__白色  阅读(156)  评论(0)    收藏  举报