0

通常の古いAndroidボタンのCompound Drawableに線を引こうとしています。ボタンのドローアブルを使用して取得しようとすることから始めましたButton.getCompoundDrawables()[1]が、線が表示されませんでした。そこで、ボタン上の複合ドローアブルの XML レイアウトに実際の画像を配置しました。これは問題なく動作しますが (写真のオレンジ色の四角)、電話を回転させると、ボタンに比例してオレンジ色の四角形のサイズが変更されないため、大きすぎます。getBounds()ローテーションか何かを呼び出す必要がありますか?

気づいたら、赤い線は水平方向の角に行きますが、垂直方向には行きません。オフか何かです。オレンジ色の四角形は drawable-[lhm]dpi/ ディレクトリに異なるサイズで存在しますが、水平と垂直の 2 つの別々のレイアウトはありません。

線を引くためのコード:

    @Override
            public View getView (int position, View convertView, ViewGroup parent)
            {           
                View row = convertView;
                if (row == null)
                {
                    LayoutInflater inflater = (LayoutInflater) _context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
                    row = inflater.inflate (R.layout.monthview, parent, false);

                }


                btn_cell = (Button) row.findViewById (R.id.bcell);
...
                    BitmapDrawable btn_draw = (BitmapDrawable) btn_cell.getCompoundDrawables ()[1];

                    if (btn_draw != null)
                    {
                        Log.d (TAG, "+++++++++++++ drawing line");
                        Bitmap btn_bmp = btn_draw.getBitmap ();
                        Bitmap offscreen_bmp = Bitmap.createBitmap(btn_bmp.getWidth(), btn_bmp.getHeight(), btn_bmp.getConfig());
                        BitmapDrawable offscreen_draw = new BitmapDrawable (offscreen_bmp);
                        offscreen_draw.setBounds (btn_draw.getBounds ());

                        Canvas c = new Canvas(offscreen_bmp);

                        // draw line
                        Paint p = new Paint();
                        p.setAntiAlias(true);
                        p.setStrokeWidth(1);
                        p.setStyle(Style.FILL_AND_STROKE);
                        p.setColor(Color.RED);

                        c.drawBitmap (btn_bmp, 0, 0, p);
                        c.drawLine (0, 0, offscreen_bmp.getWidth (), offscreen_bmp.getHeight (), p);

                        (R.drawable.cal_left_arrow_off), null, null);
                        btn_cell.setCompoundDrawables(null, offscreen_draw, null, null);
                    }

ここに画像の説明を入力 ここに画像の説明を入力

4

1 に答える 1

1

それが他の誰かを助ける場合に備えて、私はボタンを廃止し、代わりにImageViewを使用することになりました。ImageViewに線を引く方法という(明らかに)典型的な問題に遭遇しました。メソッドでImageViewのサブクラス化と線の描画については知っていましたが、onDraw()EclipseのXMLレイアウトGUI内でその「カスタム」サブクラスを参照できることを知りませんでした。私がする必要があるのは、myImageViewクラスを作成し、それをXMLソースコードで参照することだけでした。指定する代わりに、<ImageView>使用する必要が<com.example.myImageView>あり、すべてが機能しました。

カスタムBaseAdapterでmyImageViewを使用していたので、メソッドのmyImageViewに行を配置するのgetView()は次の問題でした。

        myImageView iv = (myImageView) row.findViewById (R.id.iv_draw);
        iv.setBarLength (15);
        iv.setOnClickListener (ocl);

com.example.test.myImageView.java:

public class myImageView extends android.widget.ImageView
{
    private final String TAG = this.getClass ().getName ();
    private int mBarLen = 5;

    /**
     * @param context
     * @param attrs
     */
    public myImageView (Context context, AttributeSet attrs)
    {
        super (context, attrs);
    }

    public void setBarLength (int length)
    {
        mBarLen = length;
    }

    @Override
    protected void onDraw (Canvas canvas)
    {
        super.onDraw (canvas);

        // draw 1px border
        Paint p = new Paint ();

        int x = 1;
        int y = 1;
        Rect bounds = canvas.getClipBounds ();

        int x2 = bounds.right - 1;
        int y2 = bounds.bottom - 1;

        canvas.drawLine (x, y, x2, y, p);
        canvas.drawLine (x2, y, x2, y2, p);
        canvas.drawLine (x2, y2, x, y2, p);
        canvas.drawLine (x, y2, x, y, p);

        p.setColor (Color.RED);
        p.setStrokeWidth (2);
        int bx = x + 5;
        int by = y + 5;
        canvas.drawLine (bx, by, bx+mBarLen, by, p);
        canvas.drawLine (bx, by, bx+mBarLen, by, p);

    }

}

xmlファイル:

<com.example.test.myImageView
    android:id="@+id/iv_draw"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:adjustViewBounds="true"
    android:minHeight="48dp"
    android:minWidth="24dp"
    android:scaleType="fitXY" />
于 2012-12-14T18:38:03.297 に答える