• QQ左侧滑动显示


      对于新版的QQ界面,左侧增加了一个滑动效果,相信小伙伴们早已按耐不住激动的心情,这种效果是如何实现的呢?本篇我们就一起来探讨一二。既然是滑动效果这里就要使用到HorizontalScrollView类,一个水平滑动的效果。

      对于这个效果我们可以分为一个Item Menu和Layout,通过对Item Menu设置padding值来隐藏和显示左侧的Menu菜单。

      我们的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"
        android:background="@drawable/img_frame_background" >
        
        <LinearLayout 
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:orientation="vertical">
            
            <RelativeLayout 
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <ImageView 
                   android:id="@+id/img1"
                   android:layout_width="50dp"
                   android:layout_height="50dp"
                   android:src="@drawable/img_1"
                   android:layout_marginLeft="20dp"
                   android:layout_marginTop="20dp"
                   android:layout_centerVertical="true"
                    />
                <TextView 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:textColor="#fff"
                    android:text="第一个item"
                    android:layout_toRightOf="@id/img1"
                    android:layout_centerVertical="true"
                    />
           </RelativeLayout>
           
            <RelativeLayout 
                android:layout_width="match_parent"
                android:layout_height="match_parent">
                <ImageView 
                   android:id="@+id/img2"
                   android:layout_width="50dp"
                   android:layout_height="50dp"
                   android:src="@drawable/img_2"
                   android:layout_marginLeft="20dp"
                   android:layout_marginTop="20dp"
                   android:layout_centerVertical="true"
                    />
                <TextView 
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginLeft="20dp"
                    android:textColor="#fff"
                    android:text="第二个item"
                    android:layout_toRightOf="@id/img2"
                    android:layout_centerVertical="true"
                    />
           </RelativeLayout>
            
        </LinearLayout>
    
    </RelativeLayout>

      我们的主Activity的Layout代码:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context=".MainActivity" >
    
        <com.example.menu.SlidingMenu 
            android:layout_width="match_parent"
            android:layout_height="match_parent">
            <LinearLayout 
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:orientation="horizontal"
                >
                
                <include layout="@layout/left_menu"/>
                
                <LinearLayout 
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:background="@drawable/qq"
                    />
                
            </LinearLayout>
        </com.example.menu.SlidingMenu>
        
    </RelativeLayout>

      我们自定义的SlidingMenu:

    package com.example.menu;
    
    import android.content.Context;
    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;//屏幕的宽度
        private int mMenuWidth;//设置Menu的宽度
        
        //dp
        private int mMenuRightPadding;
        private boolean once = false;
        
        /**
         * 未使用自定义属性时调用此方法
         * @param context
         * @param attrs
         */
        public SlidingMenu(Context context, AttributeSet attrs) {
            super(context, attrs);
            WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
            DisplayMetrics outMetrics = new DisplayMetrics();
            wm.getDefaultDisplay().getMetrics(outMetrics );
            mScreenWidth = outMetrics.widthPixels;
            
            //将dp转换为px
            mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
            
        }
        
        /**
         * 设置内部View的宽和高,以及自己的宽和高
         */
        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            
            if(!once){
                mWapper = (LinearLayout) getChildAt(0);
                mMenu = (ViewGroup) mWapper.getChildAt(0);
                mContent = (ViewGroup) mWapper.getChildAt(1);
                mMenuWidth = mMenu.getLayoutParams().width = mScreenWidth - mMenuRightPadding;
                mContent.getLayoutParams().width = mScreenWidth;
                once = true;
            }
            
        }
    
        /**
         * 设置子View的放置位置
         * 通过设置偏移量来隐藏Menu
         */
        @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);
            }
        }
        
        /**
         * 控制手指的滑动效果
         */
        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            int action = ev.getAction();
            switch (action) {
            case MotionEvent.ACTION_UP:
                int scrollx = getScrollX();//Menu左侧隐藏的区域宽度
                if(scrollx >= mMenuWidth/2){
                    this.smoothScrollTo(mMenuWidth, 0);
                }else{
                    this.smoothScrollTo(0, 0);
                }
                return true;
            }
            return super.onTouchEvent(ev);
        }
        
    }

      我们的主Activity:

    public class MainActivity extends Activity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);//去除标题
            setContentView(R.layout.activity_main);
            
        }
    }

      效果图:

      

  • 相关阅读:
    Asp.net Json 解析 与 直接用ip访问返回josn
    mysql 时间函数
    Android之TelephonyManager类的使用案例
    android:screenOrientation的说明 固定屏幕显示方向
    在android.app.Application中定义全局变量
    Android开发实例详解之IMF(Android SDK Sample—SoftKeyboard)
    Android InputMethodManager输入法简介
    android ImageView的属性android:scaleType,即ImageView.setScaleType(ImageView.ScaleType)
    VS编译常见错误枚举01
    Visual C++ Samples-------------Code Project
  • 原文地址:https://www.cnblogs.com/AndroidJotting/p/4469885.html
Copyright © 2020-2023  润新知