• 仿QQ侧滑菜单<大自然的搬运工-代码不是我的>


    1.记录下效果图

    2.二个工具类

    package myapplication.com.myapplicationfortest.utils;
    
    import android.util.Log;
    
    /**
     * Log统一管理类
     * 
     * @author way
     * 
     */
    public class L
    {
    
        private L()
        {
            /* cannot be instantiated */
            throw new UnsupportedOperationException("cannot be instantiated");
        }
    
        public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函数里面初始化
        private static final String TAG = "way";
    
        // 下面四个是默认tag的函数
        public static void i(String msg)
        {
            if (isDebug)
                Log.i(TAG, msg);
        }
    
        public static void d(String msg)
        {
            if (isDebug)
                Log.d(TAG, msg);
        }
    
        public static void e(String msg)
        {
            if (isDebug)
                Log.e(TAG, msg);
        }
    
        public static void v(String msg)
        {
            if (isDebug)
                Log.v(TAG, msg);
        }
    
        // 下面是传入自定义tag的函数
        public static void i(String tag, String msg)
        {
            if (isDebug)
                Log.i(tag, msg);
        }
    
        public static void d(String tag, String msg)
        {
            if (isDebug)
                Log.i(tag, msg);
        }
    
        public static void e(String tag, String msg)
        {
            if (isDebug)
                Log.i(tag, msg);
        }
    
        public static void v(String tag, String msg)
        {
            if (isDebug)
                Log.i(tag, msg);
        }
    }
    View Code
    package myapplication.com.myapplicationfortest.utils;
    
    import android.app.Activity;
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.Rect;
    import android.util.DisplayMetrics;
    import android.view.View;
    import android.view.WindowManager;
    
    /**
     * 获得屏幕相关的辅助类
     * 
     * @author zhy
     * 
     */
    public class ScreenUtils
    {
        private ScreenUtils()
        {
            /* cannot be instantiated */
            throw new UnsupportedOperationException("cannot be instantiated");
        }
    
        /**
         * 获得屏幕高度
         * 
         * @param context
         * @return
         */
        public static int getScreenWidth(Context context)
        {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.widthPixels;
        }
    
        /**
         * 获得屏幕宽度
         * 
         * @param context
         * @return
         */
        public static int getScreenHeight(Context context)
        {
            WindowManager wm = (WindowManager) context
                    .getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics);
            return outMetrics.heightPixels;
        }
    
        /**
         * 获得状态栏的高度
         * 
         * @param context
         * @return
         */
        public static int getStatusHeight(Context context)
        {
    
            int statusHeight = -1;
            try
            {
                Class<?> clazz = Class.forName("com.android.internal.R$dimen");
                Object object = clazz.newInstance();
                int height = Integer.parseInt(clazz.getField("status_bar_height")
                        .get(object).toString());
                statusHeight = context.getResources().getDimensionPixelSize(height);
            } catch (Exception e)
            {
                e.printStackTrace();
            }
            return statusHeight;
        }
    
        /**
         * 获取当前屏幕截图,包含状态栏
         * 
         * @param activity
         * @return
         */
        public static Bitmap snapShotWithStatusBar(Activity activity)
        {
            View view = activity.getWindow().getDecorView();
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache();
            Bitmap bmp = view.getDrawingCache();
            int width = getScreenWidth(activity);
            int height = getScreenHeight(activity);
            Bitmap bp = null;
            bp = Bitmap.createBitmap(bmp, 0, 0, width, height);
            view.destroyDrawingCache();
            return bp;
    
        }
    
        /**
         * 获取当前屏幕截图,不包含状态栏
         * 
         * @param activity
         * @return
         */
        public static Bitmap snapShotWithoutStatusBar(Activity activity)
        {
            View view = activity.getWindow().getDecorView();
            view.setDrawingCacheEnabled(true);
            view.buildDrawingCache();
            Bitmap bmp = view.getDrawingCache();
            Rect frame = new Rect();
            activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
            int statusBarHeight = frame.top;
    
            int width = getScreenWidth(activity);
            int height = getScreenHeight(activity);
            Bitmap bp = null;
            bp = Bitmap.createBitmap(bmp, 0, statusBarHeight, width, height
                    - statusBarHeight);
            view.destroyDrawingCache();
            return bp;
    
        }
    
    }
    View Code

    3.自定义HorizontalScrollView

    package myapplication.com.myapplicationfortest;
    
    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 myapplication.com.myapplication.R;
    import myapplication.com.myapplicationfortest.utils.ScreenUtils;
    
    
    public class SlidingMenu extends HorizontalScrollView
    {
        /**
         * 屏幕宽度
         */
        private int mScreenWidth;
        /**
         * dp
         */
        private int mMenuRightPadding;
        /**
         * 菜单的宽度
         */
        private int mMenuWidth;
        private int mHalfMenuWidth;
    
        private boolean isOpen;
    
        private boolean once;
    
        public SlidingMenu(Context context, AttributeSet attrs)
        {
            this(context, attrs, 0);
    
        }
    
        public SlidingMenu(Context context, AttributeSet attrs, int defStyle)
        {
            super(context, attrs, defStyle);
            mScreenWidth = ScreenUtils.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);
                ViewGroup menu = (ViewGroup) wrapper.getChildAt(0);
                ViewGroup content = (ViewGroup) wrapper.getChildAt(1);
    
                mMenuWidth = mScreenWidth - 150;
                mHalfMenuWidth = mMenuWidth / 2;
                menu.getLayoutParams().width = mMenuWidth;
                content.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();
            }
        }
    
    }
    View Code

    4.MainActivity

    package myapplication.com.myapplicationfortest;
    
    import android.app.Activity;
    
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.view.View;
    import android.view.Window;
    
    import myapplication.com.myapplication.R;
    
    public class MainActivity extends Activity {
    
     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 Code

    5.main 布局 activity_main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <myapplication.com.myapplicationfortest.SlidingMenu
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/id_menu"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:background="@drawable/bg"
        >
    
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="fill_parent"
            android:orientation="horizontal" >
    
            <include layout="@layout/layout_menu" />
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="@drawable/bg"
               >
                <Button
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:onClick="toggleMenu"
                    android:text="切换菜单" />
            </LinearLayout>
        </LinearLayout>
    
    </myapplication.com.myapplicationfortest.SlidingMenu>
    View Code

    侧滑布局 layout_menu.xml

    <?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"
    
        android:background="@drawable/qq" >
    
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:orientation="vertical" >
    
    
        </LinearLayout>
    
    </RelativeLayout>
    View Code

    6.styles.xml

    <resources>
        <style name="AppBaseTheme" parent="android:Theme.Light">
            <!--
                Theme customizations available in newer API levels can go in
                res/values-vXX/styles.xml, while customizations related to
                backward-compatibility can go here.
            -->
        </style>
    
        <!-- Application theme. -->
        <style name="AppTheme" parent="AppBaseTheme">
            <!-- All customizations that are NOT specific to a particular API-level can go here. -->
        </style>
    
    </resources>
    View Code
    今天多一点积累,明天少一分烦恼
  • 相关阅读:
    8.20 附加赛3
    8.22 附加赛4
    Codeforces Round #505 (Div 1 + Div 2) (A~D)
    8.9 附加赛2
    8.10 正睿暑期集训营 Day7
    8.9 正睿暑期集训营 Day6
    8.8 正睿暑期集训营 Day5
    8.7 正睿暑期集训营 Day4
    8.6 正睿暑期集训营 Day3
    8.5 正睿暑期集训营 Day2
  • 原文地址:https://www.cnblogs.com/galibujianbusana/p/5993955.html
Copyright © 2020-2023  润新知