为了账号安全,请及时绑定邮箱和手机立即绑定
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缩放
		
		
		
		
		
		
		
		
		
		
		}      
		
		
		
		
		
		
		
		
		
		
}

  请问我这个代码哪里出错了,怎么动画效果就是不一样呢

正在回答

1 回答

你好,是背景效果不一样,还是具体什么动画效果不同;背景的话,leftmenu上的背景图,记得移动至SlidingMenu上,对比视频中的activity_main。

0 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
QQ5.0侧滑菜单
  • 参与学习       62536    人
  • 解答问题       295    个

本教程将带领大家通过自定义控件实现QQ5.0侧滑菜单

进入课程
意见反馈 帮助中心 APP下载
官方微信