有没有办法在Android中创建从Canvas扩展的类?



我正在尝试创建一个继承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);
}

我真正的问题是,有没有办法首先实现这一目标?或者欢迎任何替代想法。提前谢谢。

你不能
  1. 那样做演员。由于 onDraw 是和覆盖方法,它从上面的其他地方获取参数,这是一个画布。
  2. 您可以包装该画布对象。 让你的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 
}

最新更新