• 实现QQslidingMenu侧滑效果学习笔记


    声明:只是自己的学习笔记,所以,只作为博友的参考,不喜勿喷

    实现思路:

    自定义继承HorizontalScrollView的控件

    项目github地址:

    https://github.com/ysnows/ysnowsSlidingMenu

    视频教程:

    http://www.imooc.com/learn/211

    知识点:

    1. 在没有自定义控件属性的时候,会调用两个参数的Constructor:
    /**
    	 * 未使用自定义属性时,调用
    	 * 
    	 * @param context
    	 * @param attrs
    	 */
    	public SlidingMenu(Context context, AttributeSet attrs)
    	{
    		this(context, attrs, 0);
    	}
    

    2.OnMeasure():决定内部View的宽he高,以及,自己的宽和高.
    3.onLayout():决定子View的放置he位置.
    4.获得本机的屏幕宽度(像素):

    //获得屏幕的宽度和计算设置的偏移量的像素值,并计算出menu的宽度
            WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
            DisplayMetrics metrics=new DisplayMetrics();
            windowManager.getDefaultDisplay().getMetrics(metrics);
            mScreenWidth=metrics.widthPixels;//得到屏幕的宽度(像素)
    

    5.利用typedValue进行dp/sp转换成px

    mMenuWidth= (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,mMenuPadding,context.getResources().getDisplayMetrics());
    

    6.自定义viewgroup型控件的时候的子view运用

                LinearLayout wrapper = (LinearLayout) getChildAt(0);
                wrapperMenu = (ViewGroup) wrapper.getChildAt(0);
                wrapperContent = (ViewGroup) wrapper.getChildAt(1);
    
                wrapperMenu.getLayoutParams().width = mMenuWidth;
                wrapperContent.getLayoutParams().width = mScreenWidth;
    
    
    

    7.偏移到哪里:

    this.scrollTo(mMenuWidth,0);
    

    8.抽屉式菜单:

       @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            float scale=l*1.0f/mMenuWidth;
            ViewHelper.setTranslationX(wrapperMenu,mMenuWidth*scale);
    
    
        }
    

    9.实现类似QQ的最终效果:

    @Override
        protected void onScrollChanged(int l, int t, int oldl, int oldt) {
            super.onScrollChanged(l, t, oldl, oldt);
            float scale=l*1.0f/mMenuWidth;//取值范围1-0
            //菜单的动画
            ViewHelper.setTranslationX(wrapperMenu,mMenuWidth*scale*0.5f);
            //菜单的缩放-->0.7-1
             float scaleMenu=1- 0.3f*scale;
            ViewHelper.setScaleX(wrapperMenu,scaleMenu);
            ViewHelper.setScaleY(wrapperMenu,scaleMenu);
            //菜单的透明度-0.4-1
            float alphaMenu=1- 0.6f*scale;
            ViewHelper.setAlpha(wrapperMenu,alphaMenu);
    
            //内容的动画-->缩放--->1-0.8
           float scaleContent=0.8f+0.2f*scale;
            //设置缩放的中心点
            ViewHelper.setPivotX(wrapperContent,0);
            ViewHelper.setPivotY(wrapperContent,wrapperContent.getHeight()/2);
            ViewHelper.setScaleX(wrapperContent,scaleContent);
            ViewHelper.setScaleY(wrapperContent, scaleContent);
    
        }
    
    

    10.属性动画:
    scale=1-0;

  • 相关阅读:
    酒里放茶,醉,未遂。
    利用自定义事件实现不同窗体间的通讯 Delphi篇
    主题:CS0016: 未能写入输出文件“c:\WINDOWS\Microsoft.NET\***.dll”错误处理
    delphi點擊窗體最小化,關閉按鈕時的托盤圖標設置
    delphi制作程序啟動歡迎窗體
    那年 那雪
    DOL魔盘解决方案
    专家解密“艳照门”背后三大安全陷阱
    jQuery获取Select选择的Text和 Value(转)
    技术列传 guava cache
  • 原文地址:https://www.cnblogs.com/ColdSnow/p/4312675.html
Copyright © 2020-2023  润新知