Android:FrameLayout 子类不绘制

dec*_*des 1 performance android 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>
Run Code Online (Sandbox Code Playgroud)

b) 背景旋转动画,而前景扇区保持不变

因为我需要对背景图像做更多的工作,所以我把它放到了一个 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>
Run Code Online (Sandbox Code Playgroud)

这是新的 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

发生什么了:

a) 在 setContentView(R.layout.main) 期间调用构造函数;

b) 调用 dispatchDraw 覆盖

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

有没有人看到,为什么?

小智 5

我意识到这个问题很老,但从未得到正确回答。

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

我认为除了实际的 dispatchDraw 函数之外,通过阅读给定的代码应该可以工作。你错过了 canvas.save() 和 canvas.restore()。应该很容易快速开始工作的示例:

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

至少在我的上下文中,这对我有用。希望它可以帮助其他有同样问题的人。:)