2
주어진 치수로 제대로 작동하고 표시 할 수있는 등급 표시 줄을 만들고 싶습니다.Android 등급 막대 크기
Android 기본 RatingBar는 확장되지 않으며 내가 본 다른 솔루션은 미리 정의 된 드로어 블을 사용하여 RatingBar 크기를 줄이거 나 늘리는 것이 었습니다.
크기에 맞게 조정하여 모든 치수에 맞게 조정할 수있는 방법이 있습니까?
주어진 치수로 제대로 작동하고 표시 할 수있는 등급 표시 줄을 만들고 싶습니다.Android 등급 막대 크기
Android 기본 RatingBar는 확장되지 않으며 내가 본 다른 솔루션은 미리 정의 된 드로어 블을 사용하여 RatingBar 크기를 줄이거 나 늘리는 것이 었습니다.
크기에 맞게 조정하여 모든 치수에 맞게 조정할 수있는 방법이 있습니까?
예 RatingBar와 같은 역할을하는 새로운 위젯을 만들어야합니다.
몇 가지 문제가 있습니다.
적합하지 않지만이 문제는 아주 쉽게 해결할 수 있습니다. 다음은 새로운 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;
}
}