package?com.example.qqslidingmenu.view; import?com.example.qqslidingmenu.R; import?com.nineoldandroids.view.ViewHelper; import?android.app.Notification.Action; import?android.content.Context; import?android.content.res.TypedArray; import?android.provider.ContactsContract.CommonDataKinds.Event; import?android.util.AttributeSet; import?android.util.DisplayMetrics; import?android.util.Log; 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?{??//這是一個自定義的viewgroup private?LinearLayout?mWapper; private?ViewGroup?mContent; private?ViewGroup?mMenu; private?boolean?isopen; private?int?mMenuWidth; private?boolean?once=false; private?int?mMenuRightPadding=50;//單位dp private?int?mScreenWidth; //private?int?mScreenHeigth; /*需要繼承實現(xiàn)地方法 ?*?1?onMeasure??決定其子view的寬和高?以及自己的寬和高 ?*?2?onLayout???決定子view的放置的位置 ?*?3?onTouchEvent??決定內(nèi)部view的移動效果(如果沒有移動效果則不需要)?? ?*/ /* ?*? ?*? 未使用自定義控件是調(diào)用 ?*/ public?SlidingMenu(Context?context,?AttributeSet?attrs)?{ //super(context,?attrs); this(context,attrs,0); /* WindowManager?wm=(WindowManager)?context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics?outMetrics=new?DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics);; mScreenWidth=outMetrics.widthPixels; //把dp轉(zhuǎn)化為px???????????????????????????????????????????????????//如果這里是px的話?就是把50px轉(zhuǎn)化為dp mMenuRightPadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()); Log.d("22222",?"進(jìn)入構(gòu)造函數(shù)");*/ } /* ?*?當(dāng)使用了自定義的屬性時?會調(diào)用次此構(gòu)造方法 ?*/ public?SlidingMenu(Context?context,?AttributeSet?attrs,?int?defStyle)?{ super(context,?attrs,?defStyle); //獲取我們自定義的屬性 TypedArray?a=context.getTheme().obtainStyledAttributes(attrs,?R.styleable.SlidingMenu,?defStyle,?0); int?n=a.getIndexCount();//獲取自定義屬性的數(shù)量 for(int?i=0;i<n;i++){ int?attr=a.getIndex(i); switch?(attr)?{ case?R.styleable.SlidingMenu_rightPadding:mMenuRightPadding=a.getDimensionPixelSize(attr,?(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics())); break; } } a.recycle();//使用完必須釋放 WindowManager?wm=(WindowManager)?context.getSystemService(Context.WINDOW_SERVICE); DisplayMetrics?outMetrics=new?DisplayMetrics(); wm.getDefaultDisplay().getMetrics(outMetrics);; mScreenWidth=outMetrics.widthPixels;??//獲取屏幕寬度 //把dp轉(zhuǎn)化為px???????????????????????????????????????????????????//如果這里是px的話?就是把50px轉(zhuǎn)化為dp //mMenuRightPadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()); } public?SlidingMenu(Context?context)?{ this(context,null); } /* ?*?設(shè)置子view的寬和高和自己的寬和高 ?*/ @Override protected?void?onMeasure(int?widthMeasureSpec,?int?heightMeasureSpec)?{ if(!once) { mWapper=(LinearLayout)?this.getChildAt(0); mMenu=(ViewGroup)mWapper.getChildAt(0); mContent=(ViewGroup)mWapper.getChildAt(1); mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding; mContent.getLayoutParams().width=mScreenWidth; once=true; } super.onMeasure(widthMeasureSpec,?heightMeasureSpec); } /* ?*?通過設(shè)置偏移量將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);??//x如果為正值?滾動條向右移動?內(nèi)容區(qū)向左移動? ????? ????? } } @Override public?boolean?onTouchEvent(MotionEvent?ev)?{ int?action=ev.getAction(); switch(action) { case?MotionEvent.ACTION_UP:? //隱藏在左邊的寬度 int?scrollx=getScrollX(); if(scrollx?>=?mMenuWidth/2) { isopen=false; //this.scrollTo(mMenuWidth,?0); this.smoothScrollTo(mMenuWidth,?0); }else{ isopen=true; //this.scrollTo(0,?0); this.smoothScrollTo(0,?0); } return?true; ? default:break; } return?super.onTouchEvent(ev); } public?void?openMenu(){ if(isopen)return; else { this.smoothScrollTo(0,?0); isopen=true; } } public?void?closeMenu(){ if(!isopen)return; else { this.smoothScrollTo(mMenuWidth,?0); isopen=false; } } public?void?toggle(){ if(isopen) { closeMenu(); }else?{ openMenu(); } } /* ?*?滾動發(fā)生時 ?*/ @Override protected?void?onScrollChanged(int?l,?int?t,?int?oldl,?int?oldt)?{ super.onScrollChanged(l,?t,?oldl,?oldt); float?scale=l*1.0f/mMenuWidth;????//scale隨著右劃從1到0變化 float?rightScale=0.7f+0.3f*scale; float?menuScale=1.0f-scale*0.3f; float?mMenuAlpha=0.6f+0.4f*(1-scale); //調(diào)用屬性動畫 ViewHelper.setTranslationX(mMenu,?mMenuWidth*scale*0.7f);??//有空上網(wǎng)找找這個庫的源碼 ?//抽屜式菜單效果 ViewHelper.setScaleX(mMenu,?menuScale); ViewHelper.setScaleY(mMenu,?menuScale); //----------------------------------------------控制菜單縮放從0.7到1 ViewHelper.setAlpha(mMenu,mMenuAlpha); //----------------------------------------------控制內(nèi)容區(qū)域透明度從0.6到1 //---------------------------------------------- ViewHelper.setPivotX(mContent,?0); ViewHelper.setPivotY(mContent,mContent.getHeight()/2); ViewHelper.setScaleX(mContent,?rightScale); ViewHelper.setScaleY(mContent,?rightScale); //----------------------------------------------控制內(nèi)容區(qū)域從1到0.7縮放 }?????? }
? 請問我這個代碼哪里出錯了,怎么動畫效果就是不一樣呢
2014-10-29
你好,是背景效果不一樣,還是具體什么動畫效果不同;背景的話,leftmenu上的背景圖,記得移動至SlidingMenu上,對比視頻中的activity_main。