Android分级条大小

Android分级条大小,android,android-layout,android-ui,Android,Android Layout,Android Ui,我想做一个评级栏,可以正常工作,并显示在任何给定的尺寸 Android默认的RatingBar不可缩放,我看到的任何其他解决方案都是使用预先指定的可绘制项来减少或增加RatingBar的大小 有没有办法让分级条适应给定的尺寸并适应任何尺寸?是的,通过创建一个类似分级条的新小部件可以实现。 有一些问题 剪辑路径没有AA 而且星星的坐标也不理想 但这些问题很容易解决。 下面是新RatingBar小部件的代码 您可以创建任意数量的starNumber,它们将适应其布局尺寸 import andr

我想做一个评级栏,可以正常工作,并显示在任何给定的尺寸

Android默认的RatingBar不可缩放,我看到的任何其他解决方案都是使用预先指定的可绘制项来减少或增加RatingBar的大小


有没有办法让分级条适应给定的尺寸并适应任何尺寸?

是的,通过创建一个类似分级条的新小部件可以实现。

有一些问题

  • 剪辑路径没有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;
    }

}
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Path;
导入android.util.AttributeSet;
导入android.widget.SeekBar;
公共类PRatingBar扩展SeekBar{
专用int STARNAME=5;
私人浮动空间;
私人内部评级;
private boolean firstTime=true;
公共PRatingBar(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
_init();
}
公共PRatingBar(上下文、属性集属性){
超级(上下文,attrs);
_init();
}
公共PRatingBar(上下文){
超级(上下文);
_init();
}
/**
*@返回评级
*/
public int getRating(){
回报率;
}
/**
*设置星星数
* 
*@param starNumber
*/
公共无效设置星号(int星号){
this.starNumber=starNumber;
}
私有void_init(){
setThumb(空);
SETONSEEKBARCHANGELISTER(sbcl);
post(新的Runnable(){
@凌驾
公开募捐{
setProgress((int)空格);
}
});
}
OnSeekbarchaneListener sbcl=新建OnSeekbarchaneListener(){
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
评级=(int)(getProgress()/空格)+1;
setProgress((int)(额定值*空间));
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
}
};
@凌驾
受保护的同步void onDraw(画布){
setMax(getWidth());
clipPath(calculateStarPath());
//来吧,你可以做得更好
如果(第一次){
setProgress((int)空格);
第一次=错误;
}
super.onDraw(帆布);
}
专用路径calculateStarPath(){
路径路径=新路径();
space=getWidth()/starNumber;
浮动中心=(getHeight()/2f)-(空格/2f);
浮动步长=空间/10;
浮动startX;
对于(int i=0;i
是的,通过创建一个类似于分级条的新小部件,就可以做到这一点。

有一些问题

  • 剪辑路径没有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;
    }

}
导入android.content.Context;
导入android.graphics.Canvas;
导入android.graphics.Path;
导入android.util.AttributeSet;
导入android.widget.SeekBar;
公共类PRatingBar扩展SeekBar{
专用int STARNAME=5;
私人浮动空间;
私人内部评级;
private boolean firstTime=true;
公共PRatingBar(上下文、属性集属性、int-defStyle){
超级(上下文、属性、定义样式);
_init();
}
公共PRatingBar(上下文、属性集属性){
超级(上下文,attrs);
_init();
}
公共PRatingBar(上下文){
超级(上下文);
_init();
}
/**
*@返回评级
*/
public int getRating(){
回报率;
}
/**
*设置星星数
* 
*@param starNumber
*/
公共无效设置星号(int星号){
this.starNumber=starNumber;
}
私有void_init(){
setThumb(空);
SETONSEEKBARCHANGELISTER(sbcl);
post(新的Runnable(){
@凌驾
公开募捐{
setProgress((int)空格);
}
});
}
OnSeekbarchaneListener sbcl=新建OnSeekbarchaneListener(){
@凌驾
TopTrackingTouch(SeekBar SeekBar)上的公共无效{
评级=(int)(getProgress()/空格)+1;
setProgress((int)(额定值*空间));
}
@凌驾
开始跟踪触摸时的公共无效(SeekBar SeekBar){
}
@凌驾
更改了公共进程无效(SeekBar SeekBar,int progress,
布尔值(用户){
}
};
@凌驾
受保护的同步void onDraw(画布){