微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为自定义seekBar动态更改LinearGradient颜色比率

如何解决为自定义seekBar动态更改LinearGradient颜色比率

我创建了一个带有自定义LinearGradient可绘制对象的搜索栏。但是,我希望能够更改每种颜色的渐变比率,这里我使用3种颜色,如果positionsnull,它们将平均分布。实际上,我想要提供每种颜色的宽度或比率,例如更改红色比率,并将其设置为仅占seekBar width 0%到10%

在这里,我想将0%设置为10%的红色,将10%-80%的黄色设置为80%的红色,并能够动态更改每种颜色的宽度值。

这有可能吗?如果是的话,有人可以指导我如何做吗?

我的代码

private ShapeDrawable getSeekBarGradientDrawable(int mRectWidth,int mRectHeight) {
    int[] colors = new int[] { Color.RED,Color.YELLOW,getResources().getColor(R.color.primaryButton,null)};

displayMetrics displayMetrics = new displayMetrics();
getActivity().getwindowManager().getDefaultdisplay().getMetrics(displayMetrics);
int width = displayMetrics.widthPixels - (int) getResources().getDimension(R.dimen.margin_padding_size_medium);

    Shader shader = new LinearGradient(
            0,width,mRectHeight,colors,new float[] {0.1f,0.7f,0.2f},Shader.TileMode.CLAMP);

    ShapeDrawable shape = new ShapeDrawable(new RectShape());
    shape.getPaint().setShader(shader);
    return shape;
}

可以从当前设置中看到图像,而不是我所描述的。

enter image description here

解决方法

此答案适用于将 LinearGradient 用作 Shader

通过如下设置public class MainAdminController { @FXML private AdminMenuController adminMenuController; @FXML private BorderPane adminBorderPane; @FXML public void initialize(){ adminMenuController.setMainController(this); } public void setView(String fxmlPatch){ adminBorderPane.setCenter(Fxml.loadFXML(fxmlPatch)); } } 数组,将 LinearGradient 颜色更改为从一种颜色过渡到相同的颜色:

public class AdminMenuController {
    public static final String MANAGE_ACCOUNTS = "/fxml/admin/ManageAccounts.fxml";
    public static final String MANAGE_ADMINS = "/fxml/admin/ManageAdmins.fxml";
    public static final String CHANGE_PASSWORD = "/fxml/ChangePassword.fxml";

    @FXML
    private MainAdminController mainAdminController;

    public void setMainController(MainAdminController mainAdminController) {
        this.mainAdminController = mainAdminController;
    }

    @FXML
    private ToggleGroup adminButtons;

    @FXML
    public void viewManageAccounts() {
        mainAdminController.setView(MANAGE_ACCOUNTS);
    }

    @FXML
    public void viewManageAdmins() {
        mainAdminController.setView(MANAGE_ADMINS);
    }

    @FXML
    public void viewChangePassword() {
        mainAdminController.setView(CHANGE_PASSWORD);
    }
}

更改 LinearGradient 以定义颜色的区域,如下所示:请参见LinearGradient with positions

colors

这会迫使 Shader 在整个区域上从一种颜色过渡到同一颜色,从而产生纯色。

enter image description here

以上将立即从一种颜色过渡到另一种颜色。如果您想要一个狭窄的过渡(比 LinearGradient 的默认过渡窄),则可以按以下方式操作颜色和位置数组。接下来,我们将过渡从红色更改为黄色。

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

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。