问题描述
我创建了一个带有自定义LinearGradient
可绘制对象的搜索栏。但是,我希望能够更改每种颜色的渐变比率,这里我使用3种颜色,如果positions
为null
,它们将平均分布。实际上,我想要提供每种颜色的宽度或比率,例如更改红色比率,并将其设置为仅占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;
}
可以从当前设置中看到图像,而不是我所描述的。
解决方法
此答案适用于将 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 在整个区域上从一种颜色过渡到同一颜色,从而产生纯色。
以上将立即从一种颜色过渡到另一种颜色。如果您想要一个狭窄的过渡(比 LinearGradient 的默认过渡窄),则可以按以下方式操作颜色和位置数组。接下来,我们将过渡从红色更改为黄色。
int[] colors = new int[]{Color.RED,Color.RED,Color.YELLOW,Color.GREEN,Color.GREEN};