我不明白这段代码

时间:2012-09-08 05:38:46

标签: java android superclass

我读过Hello Android书,我不明白代码的某些部分。

public class PuzzleView extends View {
    private static final String TAG = "Sudoku" ;
    private final Game game;
    public PuzzleView(Context context) {
    super(context);
    this.game = (Game) context;
    setFocusable(true);
    setFocusableInTouchMode(true);
  }
 // ...
}

private float width; // width of one tile
private float height; // height of one tile
private int selX; // X index of selection
private int selY; // Y index of selection
private final Rect selRect = new Rect();
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
    width = w / 9f;
    height = h / 9f;
    getRect(selX, selY, selRect);
    Log.d(TAG, "onSizeChanged: width " + width + ", height "+ height);
    super.onSizeChanged(w, h, oldw, oldh);
 }

超级(上下文);在这段代码中,它意味着什么,它做了什么?

this.game =(游戏)上下文;为什么我们写这个?它做了什么?

Android网站称onSizeChanged()函数用于: “当此视图的大小发生变化时,会在布局期间调用此方法” 这意味着如果要旋转手机,此功能会使程序视图显示为true。这是真的吗?

getRect(selX,selY,selRect);它意味着什么,它做了什么?

请帮帮我。 欢呼声。

2 个答案:

答案 0 :(得分:2)

对于您的第一个问题,Subclasses可以通过调用super()来调用超类构造函数

super(context);

调用超类构造函数:

public View(Context context)

在第二个问题中,this.game = (Game) context;会做两件事。首先,它将上下文转换为类Game,然后将其分配给PuzzleView的游戏字段(private final Game game;)。

getRectPuzzleView code结尾处声明。它会更改传递给它的变量rect

   private void getRect(int x, int y, Rect rect) {
      rect.set((int) (x * width), (int) (y * height), (int) (x
            * width + width), (int) (y * height + height));

ATaylor已经致电onSizeChanged。基本上,代码会覆盖继承的方法,然后在调用super方法之前“挂钩”其他功能。这是覆盖虚拟方法的标准做法(即多态行为)。

答案 1 :(得分:2)

如前所述:

super(context);

将调用父类的同名函数。

假设你有这种多态性: 类动物

void MakeNoise() {
    System.out.println("Generic Noise");
}

Class Dog延伸动物

void MakeNoise() {
    super();
    System.out.println("Woof");
}

当你从Dog Object调用MakeNoise时,你将有两个输出。

Generic Noise(由'super'调用)和'Woof'。

this.game =>当然,你需要访问该类中的绘图上下文,为此你需要一个类型为'Game'的上下文(我不熟悉Android,这就是为什么我不确定,'Game'是什么类型的' ,但它似乎与上下文兼容。

每当从该类访问'this.game'时,它将访问最初传递的上下文,从而在设备的表面上绘制。

是的,只要视图的大小发生变化,onSizeChanged就会被触发。

关于getRect:实际上没有任何线索,因为我缺少原型或函数声明。但从它的外观来看,它将采用任意值(因为传递的参数尚未初始化,据我所知),并从它构造一个'Rect'结构(X / Y到W / Z)