본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] Rainbow progress bar ( custom view sample code )

by 돼지왕 왕돼지 2012. 2. 28.
반응형


안녕하세요 돼지왕 왕돼지입니다.

오늘은 Custom view 를 만드느 방법을 알아보기 위해, Rainbow progress bar sample code 를 함께 보겠습니다.

Rainbow Progress Bar 는 김상형씨의 "안드로이드 프로그래밍 정복" 에서 발췌했습니다.
2012/02/25 - [리뷰 놀이터/책] - [책 리뷰/추천] 안드로이드 프로그래밍 정복 - 김상형

 

// 세로 프로그래스 바.
class Rainbow extends View{

   int mMax;

   int mPos;

   int mProgHeight;

   LinearGradient mShader;

 

   public Rainbow(Context context, AttributeSet attrs, int defStyle){

      super(context, attrs, defStyle);

      init();

   }

 

   public Rainbow(Context context, AttributeSet attrs){

      super(context, attrs);

      init();

   }

 

   public Rainbow(Context context){

      super(context);

      init();

   }

 

   void init(){

      mMax = 100;

      mPos = 0;

   }

 

   void setMax(int aMax){

      if (aMax > 0){

         mMax = aMax;

         invalidate();

      }

   }

 

   int getMax() { return mMax; }

 

   void setPos(int aPos){

      if (aPos < 0 || aPos > mMax){ return; }

      mPos = aPos;

      invalidate();

   }

 

   int getPos(){ return mPos; }

 

   protected void onDraw(Canvas canvas){

      if (mShader == null){

         mProgHeight = getHeight() - getPaddingTop() - getPaddingBottom();

         int[] colors = {Color.RED, Color.YELLOW, Color.GREEN, Color.BLUE};

         mShader = new LinearGradient(0, 0, 0, mProgHeight, colors, null, TileMode.CLAMP);

      }

 

      // 프로그래스 바의 status가 차지하는 영역

      RectF rt = new RectF();

      rt.left = getPaddingLeft();

      rt.rgiht = getWidth() - getPaddingRight();

      rt.bottom = getPaddingTop() + mProgHeight;

      rt.top = rt.bottom - mProgHeight * mPos / mMax;

 

      Paint fillpnt = new Paint();

      fillpnt.setShader(mShader);

      canvas.drawRect(rt, fillpnt);

 

      // 테두리

      rt.top = getPaddingTop();

      Paint outpnt = new Paint();

      outpnt.setColor(Color.WHITE);

      outpnt.setStyle(Paint.Style.STROKE);

      canvas.drawRect(rt, outpnt);

   }  

 

   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){

      int Width = 26, Height = 100;

 

      switch (MeasureSpec.getMode(widthMeasureSpec)){

      case MeasureSpec.AT_MOST:

         Width = Math.min(MeasureSpec.getSize(widthMeasureSpec), Width);

         break;

      case MeasureSpec.EXACTLY:

         Width = MeasureSpec.getSize(widthMeasureSpec);

         break;

      }

 

      // same for the horizontal

 

      setMeasuredDimension(Width, Height);

   }

 }


  
로그인 없이 추천 가능합니다. 손가락 꾸욱~

반응형

댓글