我读过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);它意味着什么,它做了什么?
请帮帮我。 欢呼声。
答案 0 :(得分:2)
对于您的第一个问题,Subclasses可以通过调用super()
来调用超类构造函数
即
super(context);
调用超类构造函数:
public View(Context context)
在第二个问题中,this.game = (Game) context;
会做两件事。首先,它将上下文转换为类Game
,然后将其分配给PuzzleView
的游戏字段(private final Game game;
)。
getRect
在PuzzleView 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)