Android: подкласс FrameLayout не рисует - PullRequest
1 голос
/ 04 марта 2011

Вот что работает:

a) FrameLayout с двумя ImageViews в main.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:id="@+id/frameLayout1"
    android:layout_height="wrap_content">

    <ImageView android:src="@drawable/radar_background"
        android:id="@+id/background" android:layout_width="wrap_content"
        android:layout_height="wrap_content"></ImageView>

    <ImageView android:src="@drawable/radar_sector" android:id="@+id/sector"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
</FrameLayout>

b) RotateAnimation на фоне, тогда как сектор переднего плана остается неизменным

Поскольку мне нужно сделать немного больше для фонового изображения, я поместил это в подкласс FrameLayout и соответственно изменил main.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:id="@+id/frameLayout1"
    android:layout_height="wrap_content">

    <com.decades.SensorTest.RadarView
        android:id="@+id/background" android:layout_width="wrap_content"
        android:layout_height="wrap_content" /> 
    <ImageView android:src="@drawable/radar_sector" android:id="@+id/sector"
        android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
</FrameLayout>

Это новый RadarView.java:

public class RadarView extends FrameLayout {

    private Bitmap mRadar;

    public RadarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public RadarView(Context context) {
        super(context);
        init();
    }
    private void init() {
        mRadar = BitmapFactory.decodeResource(getResources(), R.drawable.radar_background);
    }

    @Override
    public void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        canvas.drawBitmap(mRadar, 0, 0, null);
    }
}

Что происходит:

a) Конструктор вызывается во время setContentView (R.layout.main);

b) Переопределение dispatchDraw называется

в) Изображение не появляется на экране ...

Кто-нибудь видит, почему?

Ответы [ 4 ]

4 голосов
/ 28 июля 2015

Я понимаю, что этот вопрос старый, но на него никогда не отвечали должным образом.

Реализация представления для помещения в группу представлений - разумный путь, но иногда вы не хотите этого делать(скажем, у вас есть класс группы представления, который каким-то образом упорядочивает содержащиеся представления).В этом случае вам нужно рисовать из класса представления макета (группы представления).

Я думаю, что данный код должен работать, начиная с чтения его, помимо действительной функции dispatchDraw.Вы пропустили canvas.save () и canvas.restore ().Пример, с которым легко начать работать быстро:

@Override
public void dispatchDraw(Canvas canvas) {
    super.dispatchDraw(canvas);
    canvas.save();
    canvas.drawCircle(cX, cY, bgRadius, bgPaint);
    canvas.restore();
}

Это сработало для меня, по крайней мере, в моем контексте.Надеюсь, это поможет другим, у кого такая же проблема.:)

1 голос
/ 04 марта 2011

Вы пытались реализовать onDraw () вместо этого?

dispatchDraw () имеет отношение к дочерним представлениям.

0 голосов
/ 24 июня 2013

Я предполагаю, что вы хотели реализовать onDraw (), но этого, вероятно, недостаточно. Насколько я понимаю, макеты могут не вызывать onDraw, если им нечего рисовать, кроме своих детей. Возможно, вам придется «обмануть» макет, чтобы нарисовать себя (чтобы вы получили вызов onDraw). Простой, но не эффективный способ сделать это (включая догадки ...) - установить цвет фона макета.

Возможно, лучше прочитать код компоновки и сделать это правильно:)

0 голосов
/ 04 марта 2011

Я думаю, вам следует расширить класс View и переопределить методы onMeasure () и onDraw () .

Подробнее см. Здесь:
http://developer.android.com/guide/topics/ui/custom-components.html

Пример:
http://www.barebonescoder.com/2010/06/android-development-simple-2d-graphics-part-1/

...