我正在尝试绘制具有特定颜色的圆角矩形,但我什么都没得到。
我已经做了很多谷歌搜索,发现了一些这样的问题并全部阅读。但是,他们都没有解决我的问题。为什么我的onDraw
方法永远不会被调用?
感谢任何帮助。
public class RoundedTagItem extends RelativeLayout {
Context ctx;
String colorString;
int color;
public RoundedTagItem(Context context) {
super(context);
this.ctx = context;
color = Color.WHITE;
this.setWillNotDraw(false);
this.setPadding(10, 0, 10, 0);
}
public RoundedTagItem(Context context, String color) {
super(context);
this.ctx = context;
this.colorString = color;
this.setWillNotDraw(false);
this.setPadding(10, 0, 10, 0);
}
@Override
protected void onDraw(Canvas canvas) {
if(colorString != null)
color = Color.parseColor("#" + colorString);
int rectValue = 35;
Log.d("Rounded", "rectValue: " + rectValue);
RectF rect1 = new RectF(0, 0, rectValue, rectValue);
Paint paint = new Paint();
paint.setStrokeWidth(1);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
paint.setColor(color);
canvas.save();
canvas.drawRoundRect(rect1, 10, 10, paint);
canvas.restore();
super.onDraw(canvas);
}
public void ChangeBackgroundColor(String colorString) {
color = Color.parseColor(colorString);
invalidate();
}
}
然后我在我的主要课程上的这个自定义视图上放置了图标:
// add category items to view
LinearLayout categories = (LinearLayout) findViewById(R.id.detailTagImagesLayout);
for(int i = 0; i < item.getCategoryItems().size(); i++) {
RoundedTagItem v = null;
if(i == 0)
v = new RoundedTagItem(DetailActivity.this,
item.getCategoryItems().get(i).getColorCode());
else
v = new RoundedTagItem(DetailActivity.this);
ImageView img = new ImageView(DetailActivity.this);
img.setImageDrawable(Drawable.createFromPath(
item.getCategoryItems().get(i).getLightIconUrl()));
v.addView(img);
v.setTag(i);
v.setOnClickListener(new TagClickListener());
categories.addView(v);
}
答案 0 :(得分:1)
您可以进行/修复的一些改进/问题......
您可以将这些行移动到构造函数中:
if(colorString != null)
color = Color.parseColor("#" + colorString);
由于这个colorString
永远不会改变,现在你正在这样做,你每次调用onDraw
时都会计算它(并且他会被调用很多次)。
第二,请将super.onDraw(canvas)
移到第一行。
第三个您需要在构造函数上定义LayoutParams。如果View的宽度/高度为0,则永远不会调用其绘制!
this.setLayoutParams(new LayoutParams(150, 150));
最后请确保您使用的是RoundTagItem
。您可以使用以下标记将此视图添加到xml:<your.package.RoundTagItem>
其中your.package
是您正在使用的包(com.something.blabla
)。如果您这样使用,请务必定义layout_width
和layout_height
。
您还可以通过添加到根视图(使用findViewById(R.layout.your_root)
获取)或将视图设置为主要内容来添加您的视图程序。
RoundedTagItem myView = new RoundedTagItem(this);
setContentView(myView);
答案 1 :(得分:0)
尝试创建一个简单的单个RelativeLayout XML(rounded_tag_item.xml),并为自定义视图充气:
public class RoundedTagItem extends RelativeLayout {
public RoundedTagItem(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public RoundedTagItem(Context context) {
super(context);
init(context);
}
private void init(Context context) {
LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (inflater != null) {
RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.rounded_tag_item, new RelativeLayout(context));
// rest of stuff...
}
}
}