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)
至少在我的上下文中,这对我有用。希望它可以帮助其他有同样问题的人。:)
归档时间: |
|
查看次数: |
3884 次 |
最近记录: |