我正在尝试创建一个继承Android的Canvas类的类。我的理由是为我的游戏框架在该类中添加了更强大和有用的方法。当我尝试使用onDraw()
方法将AdvancedCanvas对象转换为Canvas时。我在draw()
方法中执行绘图部分,该方法将Advancedcanvas对象作为参数。会导致异常;
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);
}
我真正的问题是,首先有什么方法可以实现该目标?否则任何其他想法都将受到欢迎。预先感谢。
答案 0 :(得分:0)
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);
}
答案 1 :(得分:0)
在您的代码中,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
的实例,因此发生了错误。
您可以根据需要创建自定义视图this is a good example
已编辑: 试试这个:
@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
}