【问题标题】:i dont understand this code我不明白这段代码
【发布时间】:2012-09-01 22:34:41
【问题描述】:

我读了 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() 函数用于: “当这个视图的大小发生变化时,这在布局期间被调用” 这意味着如果要旋转手机,这个函数会使程序的视图显示为真。这是真的吗?

getRect(selX,selY,selRect);它是什么意思,有什么作用?

请帮助我。 干杯。

【问题讨论】:

    标签: java android superclass


    【解决方案1】:

    如前所述:

    super(context);
    

    会调用父类的同名函数。

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

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

    狗类扩展了动物

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

    当您从 Dog 对象调用 MakeNoise 时,您将有两个输出。

    通用噪声(由“super”调用)和“Woof”。

    this.game => 当然,您需要访问该类中的绘图上下文,为此您需要一个“游戏”类型的上下文(我不熟悉 Android,这就是我不熟悉的原因当然,“游戏”是什么类型,但它似乎与上下文兼容。

    每当从该类访问“this.game”时,它都会访问最初传递的上下文,从而在设备表面进行绘制。

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

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

    【讨论】:

    • 谢谢回答。用于旋转手机的 onSizedChanged() 函数?我的意思是当我旋转手机时使用这个功能。这是真的吗?
    • 说实话,我不知道。然而,事实上,在旋转时,您需要调整视图的大小以适应新的尺寸......所以是的,我相信在这种情况下它会调用“onsizeChanged”。但你比我更容易找到答案。试试看。
    【解决方案2】:

    对于您的第一个问题,子类可以通过调用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。基本上,代码会覆盖继承的方法,然后在调用超级方法之前“挂钩”附加功能。这是覆盖虚拟方法(即多态行为)的标准做法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 2014-04-11
      • 2021-11-03
      • 2018-12-28
      • 2020-03-02
      相关资源
      最近更新 更多