1

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); それは何を意味し、何をしますか?

私を助けてください。乾杯。

4

2 に答える 2

2

すでに述べたように:

super(context);

親クラスと同じ名前の関数を呼び出します。

このポリモーフィズムがあると仮定します: Class Animal

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

クラスの犬は動物を拡張します

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

Dog オブジェクトから MakeNoise を呼び出すと、2 つの出力が得られます。

Generic Noise (「super」と呼ばれる) と「Woof」。

this.game => 間違いなく、そのクラスの描画コンテキストにアクセスする必要があり、そのためには「ゲーム」タイプのコンテキストが必要です (私は Android に詳しくないため、よくわかりません。タイプは「ゲーム」ですが、文脈的には相性良さそうです。

「this.game」がそのクラスからアクセスされるたびに、最初に渡されたコンテキストにアクセスし、それによってデバイスの表面に描画します。

はい、ビューのサイズが変更されるたびに onSizeChanged が発生します。

getRect について: 実際には、プロトタイプまたは関数の宣言がないため、手がかりはありません。しかし、見た目からすると、任意の値を取り (渡された引数が初期化されていないため、私が見る限り)、そこから「Rect」構造を構築します (X/Y から W/Z へ)

于 2012-09-08T05:55:06.427 に答える
2

最初の質問については、サブクラスは次の呼び出しでスーパー クラス コンストラクターを呼び出すことができます。super()

すなわち

super(context);

スーパー クラス コンストラクターを呼び出します。

public View(Context context)

2 番目の質問でthis.game = (Game) context;は、2 つのことを行います。まず、コンテキストをクラスにキャストし、それをのゲーム フィールド ( )Gameに割り当てます。PuzzleViewprivate final Game game;

getRectPuzzleView コードの最後で宣言されています。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。基本的に、コードは継承されたメソッドをオーバーライドし、追加機能で「フック」してから、スーパー メソッドを呼び出します。これは、仮想メソッド (つまり、ポリモーフィックな動作) をオーバーライドするための標準的な方法です。

于 2012-09-08T05:41:25.447 に答える