1

我正在尝试为我的 ListView 实现一个页脚,它将充当具有五个元素的菜单类型框架。我希望元素能够(动态地,基于用户输入)显示图像或文本(或可能两者,但我还没有)。最终它将更具交互性,但现在我试图实现它,以便 ImageView(默认显示图像)将擦除图像并显示文本。

我认为实现这一点的最佳方法是在画布上绘制文本并使用android.view.View.draw(canvas c)方法将其绘制到 ImageView 上。但是,我在这样做时遇到了麻烦。具体来说,我几乎可以以任何方式修改视图(设置背景颜色、更改可绘制对象等),并且一切正常,绘制画布的代码可以正确编译,但在运行时不执行任何操作。视图保持完全不变。
注意:我试图通过代码消除任何愚蠢的错误(即确保文本不透明/与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();
        }
    });
4

2 回答 2

1

View.draw(Canvas)将视图绘制到画布上,而不是像您期望的那样反之。

如果您想按照已有的方式进行操作,则需要扩展现有的View类,可能是TextVieworImageView和 override onDraw(),如自定义组件开发指南中所述。

我想我会做的是使用类似 a 的东西FrameLayout并将其设置为包含适当的TextViewImageView必要的。这似乎比在 ImageView 中手动渲染文本更干净。

于 2012-06-06T22:24:27.763 回答
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);
        }
    }
于 2012-06-06T22:58:24.680 回答