自定义view,类似一键清理的VIew结构

先上代码 

http://download.csdn.net/detail/wed110/7745595


自定义widget 自定义view 实现。


自定义类继承View 

在主类里调用这儿布局,然后实现点击实现。

本来想做成Widget的形式,发现实现的方法有2种,一个是在frameworks里面去修改,生成SDK。另外一个是Launcher里面去修改,Launcher的动画效果。

2种方式都不会。放弃了。

下面是从别人拿来的源码

public class CircleProgress extends View{

	
	 private  static final int DEFAULT_MAX_VALUE = 100;					// 默认进度条最大�?
	 private  static final int DEFAULT_PAINT_WIDTH = 10;				// 默认画笔宽度
	 private  static final int DEFAULT_PAINT_COLOR = 0xffffcc00;		// 默认画笔颜色
	 private  static final boolean DEFAULT_FILL_MODE = true;			// 默认填充模式
	 private  static final int DEFAULT_INSIDE_VALUE = 0;				// 默认缩进距离
	
	
	 private CircleAttribute mCircleAttribute;			// 圆形进度条基本属�?

	 private int mMaxProgress;							// 进度条最大�?	 	 																												
	 private int mMainCurProgress;						// 主进度条当前�?
	 private int mSubCurProgress;						// 子进度条当前�?
	
	 private CartoomEngine mCartoomEngine;				// 动画引擎
	
	 private Drawable mBackgroundPicture;				// 背景�?
	 
	 public CircleProgress(Context context)
	 {
			super(context);		
			defaultParam();
	}

	public CircleProgress(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub

             
		defaultParam();
		
		
		TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleProgressBar);      
	        
	    mMaxProgress = array.getInteger(R.styleable.CircleProgressBar_max, DEFAULT_MAX_VALUE); 				// 获取进度条最大�?	
	    
	    boolean bFill = array.getBoolean(R.styleable.CircleProgressBar_fill, DEFAULT_FILL_MODE);			// 获取填充模式
	    int paintWidth = array.getInt(R.styleable.CircleProgressBar_Paint_Width, DEFAULT_PAINT_WIDTH);		// 获取画笔宽度	    
        mCircleAttribute.setFill(bFill);
        if (bFill == false)
        {
        	mCircleAttribute.setPaintWidth(paintWidth);
        }
        
        int paintColor = array.getColor(R.styleable.CircleProgressBar_Paint_Color, DEFAULT_PAINT_COLOR);	 // 获取画笔颜色

        Log.i("", "paintColor = " + Integer.toHexString(paintColor));
        mCircleAttribute.setPaintColor(paintColor);
        
        
	    mCircleAttribute.mSidePaintInterval = array.getInt(R.styleable.CircleProgressBar_Inside_Interval, DEFAULT_INSIDE_VALUE);// 圆环缩进距离

	    array.recycle(); //�?��要调用,否则会有问题
		
	}

	/*
	 * 默认参数
	 */
	private void defaultParam()
	{
		mCircleAttribute = new CircleAttribute();
		 
		mCartoomEngine = new CartoomEngine();
		
		mMaxProgress = DEFAULT_MAX_VALUE;								 																												
		mMainCurProgress = 0;						
	    mSubCurProgress = 0;					
		 
	}
	 
	 
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {		// 设置视图大小
		// TODO Auto-generated method stub
	//	super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		
		int width = MeasureSpec.getSize(widthMeasureSpec);
		int height = MeasureSpec.getSize(heightMeasureSpec);
		
		mBackgroundPicture = getBackground();
		if (mBackgroundPicture != null)
		{
			width = mBackgroundPicture.getMinimumWidth();
			height = mBackgroundPicture.getMinimumHeight();
		}
		
		
		
		setMeasuredDimension(resolveSize(width, widthMeasureSpec), resolveSize(width, heightMeasureSpec));
		
	}
	 
	 
	protected void onSizeChanged(int w, int h, int oldw, int oldh) {
		// TODO Auto-generated method stub
		super.onSizeChanged(w, h, oldw, oldh);
		
		mCircleAttribute.autoFix(w, h);

	}
	
	
	public void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
		       	
		if (mBackgroundPicture == null)									// 没背景图的话就绘制底�?
		{
			canvas.drawArc(mCircleAttribute.mRoundOval, 0, 360, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mBottomPaint);
		}
		
		
		float subRate = (float)mSubCurProgress / mMaxProgress;
		float subSweep = 360 * subRate;
		canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, subSweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mSubPaint);
		
		float rate = (float)mMainCurProgress / mMaxProgress;
		float sweep = 360 * rate;
		canvas.drawArc(mCircleAttribute.mRoundOval, mCircleAttribute.mDrawPos, sweep, mCircleAttribute.mBRoundPaintsFill, mCircleAttribute.mMainPaints);
	
	
	}
	
	
	/*
	 * 设置主进度�?
	 */
	 public synchronized void setMainProgress (int progress)
	 {
	    	mMainCurProgress = progress;
	    	if (mMainCurProgress < 0)
	    	{
	    		mMainCurProgress = 0;
	    	}
	    	
	    	if (mMainCurProgress > mMaxProgress)
	    	{
	    		mMainCurProgress = mMaxProgress;
	    	}
	    	
	    	invalidate();
	}
	    
    public synchronized int getMainProgress()
    {
    	return mMainCurProgress;
    }
	   
    /*
     *  设置子进度�?
     */
    public synchronized void setSubProgress (int progress)
    {
    	mSubCurProgress = progress;
    	if (mSubCurProgress < 0)
    	{
    		mSubCurProgress = 0;
    	}
    	
    	if (mSubCurProgress > mMaxProgress)
    	{
    		mSubCurProgress = mMaxProgress;
    	}
    	
    	invalidate();
    }
	    
    public synchronized int getSubProgress()
    {
    	return mSubCurProgress;
    }
    
    /*
     * �?��动画
     */
	public  void  startCartoom(int time)
	{
		mCartoomEngine.startCartoom(time);

	}
	
	/*
	 * 结束动画
	 */
	public  void  stopCartoom()
	{
		mCartoomEngine.stopCartoom();
	}
	
	
	
	class CircleAttribute
	{
		 public RectF  	mRoundOval;					// 圆形�?��矩形区域
		 public boolean mBRoundPaintsFill;			// 是否填充以填充模式绘制圆�?
		 public int  	mSidePaintInterval;			// 圆形向里缩进的距�?
		 public int    	mPaintWidth;				// 圆形画笔宽度(填充模式下无视�?
		 public int     mPaintColor;				// 画笔颜色  (即主进度条画笔颜色,子进度条画笔颜色为其半透明值) 
		 public int     mDrawPos;					// 绘制圆形的起点(默认�?90度即12点钟方向�?
		 
		 public Paint   mMainPaints;				// 主进度条画笔 	    
		 public Paint   mSubPaint;    				// 子进度条画笔 
		 
		 public Paint   mBottomPaint;				// 无背景图时绘制所用画�?

		 
		 public CircleAttribute()
		 {
			mRoundOval = new RectF();
			mBRoundPaintsFill = DEFAULT_FILL_MODE;
			mSidePaintInterval = DEFAULT_INSIDE_VALUE;
			mPaintWidth = 0;
			mPaintColor = DEFAULT_PAINT_COLOR;
			mDrawPos = -90;
			 
			mMainPaints = new Paint();		
			mMainPaints.setAntiAlias(true);
			mMainPaints.setStyle(Paint.Style.FILL);
			mMainPaints.setStrokeWidth(mPaintWidth);
			mMainPaints.setColor(mPaintColor);
		     
			mSubPaint = new Paint();
			mSubPaint.setAntiAlias(true);
			mSubPaint.setStyle(Paint.Style.FILL);
			mSubPaint.setStrokeWidth(mPaintWidth);
			mSubPaint.setColor(mPaintColor);
			
			
			
				
			mBottomPaint = new Paint();
			mBottomPaint.setAntiAlias(true);
			mBottomPaint.setStyle(Paint.Style.FILL);
			mBottomPaint.setStrokeWidth(mPaintWidth);
			mBottomPaint.setColor(Color.GRAY);
			
		 }
	
		 
		 /*
		  * 设置画笔宽度
		  */
		 public void setPaintWidth(int width)
		 {
			 mMainPaints.setStrokeWidth(width);
			 mSubPaint.setStrokeWidth(width);
			 mBottomPaint.setStrokeWidth(width);
		 }
		 
		 /*
		  * 设置画笔颜色
		  */
		 public void setPaintColor(int color)
		 {
			 mMainPaints.setColor(color);
		     int color1 = color & 0x00ffffff | 0x66000000;
		     mSubPaint.setColor(color1);	        
		 }
		 
		 /*
		  * 设置填充模式
		  */
		 public void setFill(boolean fill)
		 {
			 mBRoundPaintsFill = fill;
			 if (fill)
			 {
				 mMainPaints.setStyle(Paint.Style.FILL);
				 mSubPaint.setStyle(Paint.Style.FILL);	 
				 mBottomPaint.setStyle(Paint.Style.FILL);	
			 }else{
				 mMainPaints.setStyle(Paint.Style.STROKE);
				 mSubPaint.setStyle(Paint.Style.STROKE);	
				 mBottomPaint.setStyle(Paint.Style.STROKE);	
			 }	
		 }
		 
		/*
		 * 自动修正
		 */
		 public void autoFix(int w, int h)
		 {
			if (mSidePaintInterval != 0)
			{
				mRoundOval.set(mPaintWidth/2 + mSidePaintInterval, mPaintWidth/2 + mSidePaintInterval,
				w - mPaintWidth/2 - mSidePaintInterval, h - mPaintWidth/2 - mSidePaintInterval);	
			}else{

				int sl = getPaddingLeft();
				int sr = getPaddingRight();
				int st = getPaddingTop();
				int sb = getPaddingBottom();
			
						
				mRoundOval.set(sl + mPaintWidth/2, st + mPaintWidth/2, w - sr - mPaintWidth/2, h - sb - mPaintWidth/2);	
			}	
		 }
			
	}
	
	class CartoomEngine
	{
		public Handler mHandler; 
		public boolean mBCartoom;					// 是否正在作动�?
		public Timer   mTimer;						// 用于作动画的TIMER 
		public		 MyTimerTask	mTimerTask;			// 动画任务
		public int 	 mSaveMax;						// 在作动画时会临时改变MAX值,该变量用于保存�?以便恢复	 
		public int     mTimerInterval;				// 定时器触发间隔时�?ms)	 
		public float   mCurFloatProcess;			// 作动画时当前进度�?

		private long timeMil;
		
		public CartoomEngine()
		{
			mHandler = new Handler()
			{

				@Override
				public void handleMessage(Message msg) {
					// TODO Auto-generated method stub
					switch(msg.what)
					{
						case TIMER_ID:
						{
							if (mBCartoom == false)
							{
								return ;
							}
							
						
							mCurFloatProcess += 1;
							setMainProgress((int) mCurFloatProcess);
							
							long curtimeMil = System.currentTimeMillis();
									
							
							timeMil = curtimeMil;
							
							if (mCurFloatProcess >= mMaxProgress)
							{
								stopCartoom();
							}
						}
						break;
					}
				}
				
			};
			
			mBCartoom = false;
			mTimer = new Timer();
			mSaveMax = 0;
			mTimerInterval = 50;
			mCurFloatProcess = 0;
			
		}
		
		public synchronized void  startCartoom(int time)
		{
			if (time <= 0 || mBCartoom == true)
			{
				return ;
			}
			
			timeMil = 0;
			
			mBCartoom = true;

			setMainProgress(0);
			setSubProgress(0);
			
			mSaveMax = mMaxProgress;
			mMaxProgress = (1000 / mTimerInterval) * time;
			mCurFloatProcess = 0;
		
			
			mTimerTask = new MyTimerTask();
			mTimer.schedule(mTimerTask, mTimerInterval, mTimerInterval);

		}
		
		public synchronized void  stopCartoom()
		{

			if (mBCartoom == false)
			{
				return ;
			}
			
			mBCartoom = false;
			mMaxProgress = mSaveMax;
			
			setMainProgress(0);
			setSubProgress(0);
			
			if (mTimerTask != null)
			{
				mTimerTask.cancel();
				mTimerTask = null;
			}
		}
		
		private final static int TIMER_ID = 0x0010;
		
		class MyTimerTask extends TimerTask{

			@Override
			public void run() {
				// TODO Auto-generated method stub
				Message msg = mHandler.obtainMessage(TIMER_ID);
				msg.sendToTarget();
		
			}
			
		}
		
		
	}
	
	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值