我正在尝试为我的ListView实现一个页脚,它将作为一个包含五个元素的菜单类型框架。我希望元素能够(动态地,基于用户输入)显示图像或文本(或者可能两者,但我还没有)。最终它会更具交互性但是现在我试图实现它,以便ImageView(默认情况下显示图像)会擦除图像并显示文本。
我认为实现此目的的最佳方法是在画布上绘制文本并使用android.view.View.draw(canvas c)方法将其绘制到ImageView上。但是,我在做这件事时遇到了麻烦。具体来说,我可以几乎任何方式修改视图(设置背景颜色,更改drawable等等)并且一切正常,绘制画布的代码编译正确,但它不做< / strong>运行时的任何内容。视图保持完全不变 (注意:我试图通过代码消除任何愚蠢的错误(即确保文本不透明/与bg颜色相同,确保文本在视图区域内绘制等)但我不是100%它没有错误。)
我尝试绘制到传递给onClick函数的视图并绘制到从传递的视图构造的新ImageView - 两者都不起作用。 有没有人有什么建议? 代码如下:
login_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Bitmap img = Bitmap.createBitmap( 60, 60, Config.ARGB_8888);
Canvas c = new Canvas();
c.setBitmap(img);
Paint myPaint = new Paint();
myPaint.setTypeface(mFace);
myPaint.setColor(android.R.color.black);
myPaint.setTextSize(2);
myPaint.setTextAlign(Paint.Align.LEFT);
String content = "testing";
c.drawText(content, 0,0, myPaint);
view.draw(c);//does nothing
ImageView view2 = (ImageView) view;
view2.setBackgroundColor(android.R.color.white); //this works perfectly
view2.draw(c);//does nothing
Toast.makeText(MainListView.this, ""+c.getHeight(), Toast.LENGTH_SHORT).show(); //making sure c has height - this returns 60 as expected
Toast.makeText(MainListView.this, "end of method", Toast.LENGTH_SHORT).show();
}
});
答案 0 :(得分:1)
View.draw(Canvas)
将视图绘制到画布上,而不是像您期望的那样反过来。
如果您希望按照现有的方式进行操作,则需要扩展现有的View
课程,可能TextView
或ImageView
,并覆盖onDraw()
,如Custom Components Dev Guide中所述。
我认为我要做的是使用FrameLayout
之类的内容,并根据需要将其设置为包含相应的TextView
或ImageView
。这似乎比在ImageView中手动渲染文本更清晰。
答案 1 :(得分:0)
您可以从位图创建画布,并将位图设置为ImageView的图像。
Bitmap img = Bitmap.createBitmap( 60, 60, Config.ARGB_8888);
Canvas c = new Canvas(img);
Paint myPaint = new Paint();
myPaint.setTypeface(mFace);
myPaint.setColor(android.R.color.black);
myPaint.setTextSize(2);
myPaint.setTextAlign(Paint.Align.LEFT);
String content = "testing";
c.drawText(content, 0,0, myPaint);
ImageView view2 = (ImageView) view;
view2.setImageBitmap(img);
Toast.makeText(MainListView.this, ""+c.getHeight(), Toast.LENGTH_SHORT).show(); //making sure c has height - this returns 60 as expected
Toast.makeText(MainListView.this, "end of method", Toast.LENGTH_SHORT).show();
虽然,我认为这样做的“正确”方法是使用View的扩展并覆盖onDraw方法,根据一些局部变量进行不同的绘制:
login_button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
((MyView)view).mContextVariable = true; //or false, etc
//you might not need this invalidate, because the click event probably causes and invalidate to be called
view.invalidate();
}
}
class MyView extends View
{
Paint myPaint;
boolean mContextVariable;
public MyView(Context context)
{
super(context);
myPaint = new Paint();
myPaint.setTypeface(mFace);
myPaint.setColor(android.R.color.black);
myPaint.setTextSize(2);
myPaint.setTextAlign(Paint.Align.LEFT);
}
@Override
protected void onDraw(Canvas canvas)
{
if(mContextVariable)
{
//draw something
}
else
{
//draw something else
}
canvas.drawText("testing", 0,0, myPaint);
}
}