我正在尝试创建一个继承Android的Canvas类的类。我的理由是为我的游戏框架向该类添加更健壮和有用的方法。当我尝试以onDraw()
方法将我的高级画布对象强制转换为画布时。我在draw()
方法中执行绘图部分,该方法将高级画布对象作为参数。它会导致异常;
java.lang.ClassCastException: android.view.Surface$CompatibleCanvas 不能强制转换为 com.example.x.AdvancedCanvas
这是我下面的代码块
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
AdvancedCanvas advancedcanvas = (AdvancedCanvas) canvas;
draw(advancedcanvas);
}
我真正的问题是,有没有办法首先实现这一目标?或者欢迎任何替代想法。提前谢谢。
- 那样做演员。由于 onDraw 是和覆盖方法,它从上面的其他地方获取参数,这是一个画布。
- 您可以包装该画布对象。 让你的
AdvancedCanvas
接受 canvas 作为参数,并在里面保留对它的引用,并在"AdvancedCanvas"中添加额外的字段和方法。
前任:
class AdvancedCanvas{
private Canvas mCanvas;
public AdvancedCanvas(Canvas canvas){ mCanvas = canvas }
public void doSmt(){ //use mCanvas}
}
因此,您将能够执行以下操作:
onDraw(Canvas canvas){
AdvancedCanvas ac = AdvancedCanvas(canvas);
}
在您的代码中,Canvas
是父类,AdvancedCanvas
是子类。 始终允许从子类向上转换到父类,但从父类向下转换为子级涉及类型检查,并可能引发 ClassCastException。
例如:
Animal animal = getAnimal(); // Maybe a Dog? Maybe a Cat? Maybe an Animal?
if (animal instanceof Dog) { // only successful in this condition
Dog castedDog = (Dog) animal;
}
但是Canvas
不是AdvancedCanvas
的实例,所以发生了错误。
如果您愿意,可以创建自定义视图,这是一个很好的示例
已编辑: 试试这个:
@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);
AdvancedCanvas advancedcanvas = new AdvancedCanvas();
advancedcanvas.property1 = canvas.property1;//prepare advancedcanvas
advancedcanvas.setProperty2(canvas.property2)//or like this
draw(advancedcanvas);//then use advancedcanvas
}