有什么方法可以创建从Android中的Canvas扩展的类吗?

时间:2018-09-18 08:11:55

标签: java android frameworks android-canvas

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

我真正的问题是,首先有什么方法可以实现该目标?否则任何其他想法都将受到欢迎。预先感谢。

2 个答案:

答案 0 :(得分:0)

  1. 您不能像这样进行演员表。由于onDraw是and overlay方法,因此它从上方的其他位置(即画布)获取参数。
  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);
}

答案 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 
    }