1

这是,什么有效:

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) 在背景上旋转动画,而前景扇区保持不变

因为我需要对背景图像做更多的事情,所以我将它放入 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

4 回答 4

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();
}

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

于 2015-07-28T12:25:11.423 回答
1

您是否尝试过实现onDraw()

dispatchDraw() 与子视图有关。

于 2011-03-04T17:11:03.503 回答
0

我认为您应该扩展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/

于 2011-03-04T17:15:07.163 回答
0

我猜你想实现 onDraw(),但这可能还不够。据我了解,布局可能不会调用 onDraw,如果他们除了孩子之外没有任何东西可以绘制。您可能需要“欺骗”布局以绘制自身(因此您将获得 onDraw 调用)。我们这样做的一种简单但不高效的方法(涉及猜测......)是设置布局的背景颜色。

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

于 2013-06-24T11:04:53.260 回答