1

5 つの要素を持つメニュー タイプのフレームとして機能する ListView のフッターを実装しようとしています。要素が(ユーザー入力に基づいて動的に)画像またはテキストのいずれか(または両方)を表示できるようにしたいのですが、まだそこにはありません)。最終的にはよりインタラクティブになりますが、今のところ、ImageView (デフォルトで画像を表示する) が画像を消去し、代わりにテキストを表示するように実装しようとしていました。

これを実装する最善の方法は、キャンバスにテキストを描画し、android.view.View.draw(canvas c)メソッドを使用して ImageView に描画することだと思いました。しかし、私はこれを行うのに問題があります。具体的には、ほとんどすべての方法でビューを変更でき (背景色の設定、ドローアブルの変更など)、すべて正常に動作し、キャンバスを描画するコードは適切にコンパイルされますが、実行時には何もしませ。ビューはまったく変更されません。
注:コードを使用して愚かな間違いを排除しようとしました(つまり、テキストが透明でない/背景と同じ色でないことを確認した、テキストがビューの領域内に描画されたことを確認したなど)が、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クラス (おそらくTextViewor ImageView、および override ) を拡張する必要があります。onDraw()

私がすることは、 a のようなものを使用してFrameLayout、適切なTextViewまたはImageView必要に応じて含むように設定することだと思います。これは、ImageView でテキストを手動でレンダリングするよりもきれいに見えます。

于 2012-06-06T22:24:27.763 に答える
0

Bitmap から Canvas を作成し、Bitmap を ImageView の Image として設定できます。

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 に答える