2011-11-10 3 views
2

주어진 치수로 제대로 작동하고 표시 할 수있는 등급 표시 줄을 만들고 싶습니다.Android 등급 막대 크기

Android 기본 RatingBar는 확장되지 않으며 내가 본 다른 솔루션은 미리 정의 된 드로어 블을 사용하여 RatingBar 크기를 줄이거 나 늘리는 것이 었습니다.

크기에 맞게 조정하여 모든 치수에 맞게 조정할 수있는 방법이 있습니까?

답변

0

예 RatingBar와 같은 역할을하는 새로운 위젯을 만들어야합니다. enter image description here

몇 가지 문제가 있습니다.

  • 클리핑 경로 AA
  • 이없는 그리고 별의 좌표는

적합하지 않지만이 문제는 아주 쉽게 해결할 수 있습니다. 다음은 새로운 RatingBar 위젯의 코드입니다.

원하는만큼 starNumber를 만들 수 있으며 레이아웃 크기에 맞게 조정할 수 있습니다.

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Path; 
import android.util.AttributeSet; 
import android.widget.SeekBar; 

public class PRatingBar extends SeekBar { 

    private int starNumber = 5; 
    private float space; 
    private int rating; 
    private boolean firstTime = true; 

    public PRatingBar(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     _init(); 
    } 

    public PRatingBar(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     _init(); 
    } 

    public PRatingBar(Context context) { 
     super(context); 
     _init(); 

    } 

    /** 
    * @return the rating 
    */ 
    public int getRating() { 
     return rating; 
    } 

    /** 
    * Sets the number of stars 
    * 
    * @param starNumber 
    */ 
    public void setStarNumber(int starNumber) { 
     this.starNumber = starNumber; 
    } 

    private void _init() { 
     setThumb(null); 
     setOnSeekBarChangeListener(sbcl); 
     post(new Runnable() { 

      @Override 
      public void run() { 
       setProgress((int) space); 
      } 
     }); 
    } 

    OnSeekBarChangeListener sbcl = new OnSeekBarChangeListener() { 

     @Override 
     public void onStopTrackingTouch(SeekBar seekBar) { 
      rating = (int) (getProgress()/space) + 1; 
      setProgress((int) (rating * space)); 
     } 

     @Override 
     public void onStartTrackingTouch(SeekBar seekBar) { 
     } 

     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, 
       boolean fromUser) { 
     } 
    }; 

    @Override 
    protected synchronized void onDraw(Canvas canvas) { 

     setMax(getWidth()); 
     canvas.clipPath(calculateStarPath()); 

     // TODO C'mon you can do better than that 
     if (firstTime) { 
      setProgress((int) space); 
      firstTime = false; 
     } 

     super.onDraw(canvas); 

    } 

    private Path calculateStarPath() { 
     Path path = new Path(); 

     space = getWidth()/starNumber; 
     float centerY = (getHeight()/2f) - (space/2f); 
     float step = space/10; 
     float startX; 
     for (int i = 0; i < starNumber; i++) { 
      startX = i * space; 

      path.moveTo(startX + (step * 5), centerY + 0); 

      path.lineTo(startX + (step * 3.3f), centerY + (step * 3.3f)); 

      path.lineTo(startX, centerY + (step * 4)); 

      path.lineTo(startX + (step * 2.3f), centerY + (step * 6.3f)); 

      path.lineTo(startX + +(step * 2), centerY + space); 

      path.lineTo(startX + (step * 5), centerY + (step * 8.1f)); 

      path.lineTo(startX + +(step * 8), centerY + space); 

      path.lineTo(startX + (step * 7.6f), centerY + (step * 6.3f)); 

      path.lineTo(startX + (step * 10), centerY + (step * 4)); 

      path.lineTo(startX + (step * 6.7f), centerY + (step * 3.3f)); 

      path.close(); 
     } 
     return path; 
    } 

}