Yua*_*uan 36 android statelist
我有一个GridView来显示一些对象,并且在视觉上每个对象都有一个图像图标和一个文本标签.我还希望图像图标在单击时具有一些"推动和弹出"效果,也就是说,按下时,图像将向右下方移动一小段距离,并在释放后返回其原始位置.
对象(及其图像图标)来自某些动态源.我的直觉是为每个项创建一个StateListDrawable,它有两种状态:是否按下.对于GridView项目视图,我会使用一个Button,它可以容纳Drawable和一个标签,完全满足我的要求.
我定义了一个item类来包装原始对象:
public class GridItem<T> {
public static final int ICON_OFFSET = 4;
private StateListDrawable mIcon;
private String mLabel;
private T mObject;
public Drawable getIcon() {
return mIcon;
}
public void setIcon(Drawable d) {
if (null == d) {
mIcon = null;
}else if(d instanceof StateListDrawable) {
mIcon = (StateListDrawable) d;
} else {
InsetDrawable d1 = new InsetDrawable(d, 0, 0, ICON_OFFSET, ICON_OFFSET);
InsetDrawable d2 = new InsetDrawable(d, ICON_OFFSET, ICON_OFFSET, 0, 0);
mIcon = new StateListDrawable();
mIcon.addState(new int[] { android.R.attr.state_pressed }, d2);
mIcon.addState(StateSet.WILD_CARD, d1);
//This won't help either: mIcon.addState(new int[]{}, d1);
}
}
public String getLabel() {
return mLabel;
}
public void setLabel(String l) {
mLabel = l;
}
public T getObject() {
return mObject;
}
public void setObject(T o) {
mObject = o;
}
}
Run Code Online (Sandbox Code Playgroud)
现在的问题是,当我触摸一个网格项时,图标"移动"就像我预期的那样,但是当我的手指抬起离开项目时它不会恢复原来的位置.
我的问题是:如何以编程方式创建一个StateListDrawable等效于一个从XML资源膨胀的状态
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"
android:drawable="@drawable/image_pressed" />
<item android:drawable="@drawable/image_normal" />
</selector>
Run Code Online (Sandbox Code Playgroud)
?
wje*_*hak 41
如果你的drawable只是位图,你可以通过编程方式绘制它们,现在它应该有帮助,但是我想知道InsetDrawable这里使用的问题是什么,基本上使用BitmapDrawables以编程方式绘制的准备,你需要修改你的方法来接受位图b
Bitmap bc1 = Bitmap.createBitmap(b.getWidth() + ICON_OFFSET, b.getHeight() + ICON_OFFSET, Bitmap.Config.ARGB_8888);
Canvas c1 = new Canvas(bc1);
c1.drawBitmap(b, 0, 0, null);
Bitmap bc2 = Bitmap.createBitmap(b.getWidth() + ICON_OFFSET, b.getHeight() + ICON_OFFSET, Bitmap.Config.ARGB_8888);
Canvas c2 = new Canvas(bc2);
c2.drawBitmap(b, ICON_OFFSET, ICON_OFFSET, null);
mIcon = new StateListDrawable();
mIcon.addState(new int[] { android.R.attr.state_pressed }, new BitmapDrawable(bc2));
mIcon.addState(StateSet.WILD_CARD, new BitmapDrawable(bc1));
Run Code Online (Sandbox Code Playgroud)
The*_*uto 13
我可以看到答案已被接受.如果你想动态分配来自用户的按钮颜色的正常和按下状态,我正在分享.然后你可以调用这个函数:
public static StateListDrawable convertColorIntoBitmap(String pressedColor, String normalColor){
/*Creating bitmap for color which will be used at pressed state*/
Rect rectPressed = new Rect(0, 0, 1, 1);
Bitmap imagePressed = Bitmap.createBitmap(rectPressed.width(), rectPressed.height(), Config.ARGB_8888);
Canvas canvas = new Canvas(imagePressed);
int colorPressed = Color.parseColor(pressedColor);
Paint paintPressed = new Paint();
paintPressed.setColor(colorPressed);
canvas.drawRect(rectPressed, paintPressed);
RectF bounds = new RectF();
bounds.round(rectPressed);
/*Creating bitmap for color which will be used at normal state*/
Rect rectNormal = new Rect(0, 0, 1, 1);
Bitmap imageNormal = Bitmap.createBitmap(rectNormal.width(), rectNormal.height(), Config.ARGB_8888);
Canvas canvasNormal = new Canvas(imageNormal);
int colorNormal = Color.parseColor(normalColor);
Paint paintNormal = new Paint();
paintNormal.setColor(colorNormal);
canvasNormal.drawRect(rectNormal, paintNormal);
/*Now assigning states to StateListDrawable*/
StateListDrawable stateListDrawable= new StateListDrawable();
stateListDrawable.addState(new int[]{android.R.attr.state_pressed}, new BitmapDrawable(imagePressed));
stateListDrawable.addState(StateSet.WILD_CARD, new BitmapDrawable(imageNormal));
return stateListDrawable;
}
Run Code Online (Sandbox Code Playgroud)
现在您只需将其设置为文本视图或按钮背景,如下所示:
if(android.os.Build.VERSION.SDK_INT>=16){
yourbutton.setBackground(convertColorIntoBitmap("#CEF6CE00","#4C9D32"));
}else{
yourbutton.setBackgroundDrawable(convertColorIntoBitmap("#CEF6CE00","#4C9D32"));
}
Run Code Online (Sandbox Code Playgroud)
在这里,您可以看到动态传递颜色所需的一切,我们已经完成了.希望这会有所帮助:)你可以在这里找到它的要点:)
| 归档时间: |
|
| 查看次数: |
30331 次 |
| 最近记录: |