Рисование линии поверх кнопки в Android? - PullRequest
2 голосов
/ 04 ноября 2011

Я возиться с приложением календаря в Android и хотел бы иметь возможность размещать линии поверх кнопки или помещать изображение поверх кнопки в определенном месте Y.Есть ли способ сделать это?Я не думаю, что обычные элементы рисования (слева, сверху, справа, снизу) дадут мне нужное расположение.Спасибо!

calendar view with images/lines on buttons

ОБНОВЛЕНИЕ:

Ниже приведены результаты кода ниже для рисования линии на нарисованной кнопке.То, что я должен был сделать, это дать кнопке прозрачное изображение в формате png для топа, который можно нарисовать в коде XML.Без этого это не сработало бы.

Одна из проблем, которые я вижу здесь, заключается в том, что я ограничен всего несколькими строками.В одном из ответов говорилось что-то о расположении кнопок на макете, но я не уверен, что следую.Придется еще немного поэкспериментировать.

Есть ли способ рисовать на всей кнопке, а не только на маленьких нарисованных областях?

Resules after drawing lines on top drawable

package com.test.buttondraw;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.widget.Button;

public class ButtonDrawTestActivity extends Activity
{
    /** Called when the activity is first created. */
    @Override
    public void onCreate (Bundle savedInstanceState)
    {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.main);

        Button b1 = (Button) findViewById (R.id.button1);

        // get the second array element (0 based) which is the top drawable
        BitmapDrawable d = (BitmapDrawable) b1.getCompoundDrawables ()[1];

        if (d != null)
        {   // thanks to dbrettschneider for bitmap code sample
            Bitmap b1src = d.getBitmap ();
            Bitmap tmp = Bitmap.createBitmap(b1src.getWidth(), b1src.getHeight(), b1src.getConfig());
            BitmapDrawable bd = new BitmapDrawable (tmp);
            bd.setBounds (d.getBounds ());

            Canvas c = new Canvas(tmp);

            Paint p = new Paint();
            p.setAntiAlias(true);

            c.drawBitmap (b1src, 0, 0, p);

            // set thickness of line
            p.setStyle (Style.STROKE);
            p.setStrokeWidth (5);

            // colors to use for each y position
            int [] clr    = {Color.BLACK,     Color.RED,     Color.GREEN, 
                                  Color.MAGENTA, Color.WHITE, Color.YELLOW, 
                                  Color.CYAN,        Color.BLUE,   Color.DKGRAY };
            int ypos = 10;

            // draw a different colored line for each element in the ypos array
            for (int i = 0; i < clr.length; i++)
            {
                p.setColor(clr[i]); 
                c.drawLine (0, ypos, b1src.getWidth (), ypos, p);
                ypos += 8;
            }

            b1.setCompoundDrawables (null, bd, null, null);
        }

    }

}

Вот код XML:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:drawableTop="@drawable/png_transbg"
    android:maxHeight="128dp"
    android:maxWidth="128dp"
    android:minHeight="128dp"
    android:minWidth="128dp"
    android:text="Button" />

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Как сказал dtmilano, вы можете складывать Views в FrameLayout. Таким образом, вы можете поместить в нее кнопку и наложить второй вид. Во втором представлении вы будете делать свой собственный рисунок.

Однако, если вы просто хотите добавить цветные линии над текстом кнопки, было бы более элегантно последовать совету Кевина и пойти по пути разметки. Я бы сделал это так:

<LinearLayout android:orientation="vertical"

              style="@android:style/Widget.Button"

              android:layout_width="wrap_content"
              android:layout_height="wrap_content">
  <View android:background="#f00"

        android:layout_margin="1dp"
        android:layout_height="4dp"
        android:layout_width="match_parent"/>
  <View android:background="#0f0"

        android:layout_margin="1dp"
        android:layout_height="4dp"
        android:layout_width="match_parent"/>
  <View android:background="#00f"

        android:layout_margin="1dp"
        android:layout_height="4dp"
        android:layout_width="match_parent"/>
  <TextView android:text="Button"

            android:textAppearance="@android:style/TextAppearance.Widget.Button"

            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</LinearLayout>

Конечно, вы бы добавили представления, которые динамически представляют строки в вашем коде. Также вы должны экстернализовать размерные константы. Чтобы отделить строки от текста кнопки, вы можете использовать другой вложенный LinearLayout. Наконец, вы можете обернуть все это в пользовательский вид.

РЕДАКТИРОВАТЬ: Если вы хотите распределить любое свободное пространство на линии, установите их layout_heights на 0dp и их layout_weights на 1.

0 голосов
/ 04 ноября 2011

Используйте FrameLayout и размещайте изображения поверх кнопки. Вы можете добавить несколько дочерних элементов в FrameLayout и контролировать их положение в FrameLayout, назначая гравитацию каждому дочернему элементу с помощью атрибута android: layout_gravity.

0 голосов
/ 04 ноября 2011

Вы можете сделать это, но вам, вероятно, понадобится какой-то контейнер макетов, а не просто кнопка и рисованные элементы (возможно, вы сможете настроить отступы / отступы по своему вкусу).Обычно я голосую за LinearLayout, а не за RelativeLayout из-за сложности последней.

Трудно быть более конкретным, не видя некоторый код.

...