android-layout - Android RatingBar 大小

标签 android-layout android

我想制作一个评级栏,它可以在给定的任何尺寸下正常工作和显示。

Android 默认的 RatingBar 无法缩放,我看到的任何其他解决方案都是通过预定义的可绘制对象减少或增加 RatingBar 的大小。

有什么方法可以让 RatingBar 适应给定的维度并适应任何维度?

最佳答案

是的,通过创建一个类似于 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;
    }

}

关于android-layout - Android RatingBar 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8074155/

相关文章:

android - 您的 APK 或 Android App Bundle 需要具有包名称 com.voca.abc

android - 在 Android 上以编程方式安装/访问 VPN/WIFI 证书

Android Tab内容与选项卡重叠

java - 在 Android 上查找缺口切口类型

android - 设置 GridView 的默认选择

android - clearColorFilter() 不适用于 android 2.3

java - Android 游戏(Llama 或 Duck)内存不足错误

java - 从我的 Android 应用程序发送电子邮件

android - 挂起函数 'callGetApi' 只能从协程或另一个挂起函数中调用

android - 如何为 Samsung Galaxy Note 2 创建 Android AVD?