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; /*需要继承实现地方法 * 1 onMeasure 决定其子view的宽和高 以及自己的宽和高 * 2 onLayout 决定子view的放置的位置 * 3 onTouchEvent 决定内部view的移动效果(如果没有移动效果则不需要) */ /* * * 未使用自定义控件是调用 */ 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转化为px //如果这里是px的话 就是把50px转化为dp mMenuRightPadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()); Log.d("22222", "进入构造函数");*/ } /* * 当使用了自定义的属性时 会调用次此构造方法 */ 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();//获取自定义属性的数量 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转化为px //如果这里是px的话 就是把50px转化为dp //mMenuRightPadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,50,context.getResources().getDisplayMetrics()); } public SlidingMenu(Context context) { this(context,null); } /* * 设置子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); } /* * 通过设置偏移量将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如果为正值 滚动条向右移动 内容区向左移动 } } @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(); } } /* * 滚动发生时 */ @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); //调用属性动画 ViewHelper.setTranslationX(mMenu, mMenuWidth*scale*0.7f); //有空上网找找这个库的源码 //抽屉式菜单效果 ViewHelper.setScaleX(mMenu, menuScale); ViewHelper.setScaleY(mMenu, menuScale); //----------------------------------------------控制菜单缩放从0.7到1 ViewHelper.setAlpha(mMenu,mMenuAlpha); //----------------------------------------------控制内容区域透明度从0.6到1 //---------------------------------------------- ViewHelper.setPivotX(mContent, 0); ViewHelper.setPivotY(mContent,mContent.getHeight()/2); ViewHelper.setScaleX(mContent, rightScale); ViewHelper.setScaleY(mContent, rightScale); //----------------------------------------------控制内容区域从1到0.7缩放 } }
请问我这个代码哪里出错了,怎么动画效果就是不一样呢