Android:FrameLayout子类不绘制

时间:2011-03-04 17:03:45

标签: android performance custom-view drawbitmap

这是有效的:

a)在main.xml中有两个ImageView的FrameLayout

    

<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覆盖

c)图像出现在屏幕上......

有人看到,为什么?

4 个答案:

答案 0 :(得分:4)

我意识到这个问题已经过时了,但它从来没有得到适当的回答。

实现视图以放入视图组是一种合理的方法,但有时您不想这样做(假设您有一个视图组类以某种方式排列包含的视图)。 在这种情况下,您需要从布局(视图组)视图类中进行绘制。

我认为除了实际的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 :(得分:1)

您是否尝试过实施onDraw()

dispatchDraw()与子视图有关。

答案 2 :(得分:0)

我认为您应该扩展查看类并覆盖 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/

答案 3 :(得分:0)

我猜你想要实现onDraw(),但这可能还不够。根据我的理解,如果除了孩子之外没有任何东西可以绘制,布局可能不会调用onDraw。你可能需要&#34;技巧&#34;绘制自己的布局(这样你就可以进行onDraw调用)。我们这样做的简单而无效的方法(涉及猜测...)是设置布局的背景颜色。

更好的方法是阅读布局代码并正确执行:)