0

我正在尝试在常规旧 Android 按钮的 Compound Drawable 上画一条线。我一开始只是尝试使用按钮的可绘制对象,Button.getCompoundDrawables()[1]但线条永远不会出现。因此,我继续在我的 XML 布局中为按钮上的复合可绘制对象放置了一个实际图像。这可以正常工作(图片中的橙色方块)但是当手机旋转时,橙色方块不会调整大小,与按钮成比例,所以它最终太大了。我是否需要要求getBounds()轮换或其他什么?

必须对drawable进行一些调整,因为如果您注意到,红线会在水平方向上到达角落,而不是在垂直方向上;它关闭或什么的。橙色方块在 drawable-[lhm]dpi/ 目录中以不同的尺寸存在,但我没有水平和垂直两种单独的布局。

画线代码:

    @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 回答