3

現在、PaintPotと呼ばれるAndroidプログラム用に提供されたコードを調べています。これにより、ユーザーはAndroidデバイスで指でペイントできます。

このコードは、画面がタップされたとき、ボタンがクリックされたときなどに発生するイベントを処理します。

// Here is the event dispatcher for our app.  We need to Override the method for the Form
// superclass
@Override
public boolean dispatchEvent(Component component, String id, String eventName,
                             Object[] args) {

    //if the canvas is touched by a tapping finger
    if (component.equals(myCanvas) && eventName.equals("Touched")) {
        canvasTouced(((Float) args[0]).intValue(), ((Float) args[1]).intValue());
        return true;

        //if the canvas is touched by a dragging finger, paint the line this way
    } else if (component.equals(myCanvas) && eventName.equals("Dragged")) {
        drawLine(((Float) args[2]).intValue(),
                ((Float) args[3]).intValue(),
                ((Float) args[4]).intValue(),
                ((Float) args[5]).intValue());
        return true;

        //if the canvas is touched while the blue button is selected
    } else if (component.equals(btnBlue) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_BLUE);
        return true;

        //if the canvas is touched while the green button is selected
    } else if (component.equals(btnGreen) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_GREEN);
        return true;

        //if the canvas is touched while the red button is selected
    } else if (component.equals(btnRed) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_RED);
        return true;

        //if the wipe button is selected
    } else if (component.equals(btnWipe) && eventName.equals("Click")) {
        myCanvas.Clear();
        return true;
    }


    return false;
}

コードは正常に機能し、私が望むことを「現状のまま」実行します。しかし、私が本当に理解していないのは、ユーザーがキャンバス上で指をタップまたはドラッグした場合のifステートメントが「同じレベル」にあるか、カラーボタンが選択されている場合は同じifステートメント内にあるということです。ユーザーが画面上で指をタップまたはドラッグしたときではなく、作成される線または点を決定する同じコードで、線または点のサイズだけでなく、線または点の色も要求する必要があります。ドット、選択した色のボタンによって異なりますか?

より完全なリファレンスについては、誰かが興味を持っている場合は、ここにコード全体があります:

import android.graphics.Color;
import com.google.devtools.simple.runtime.components.android.Button;
import com.google.devtools.simple.runtime.components.Component;
import com.google.devtools.simple.runtime.components.HandlesEventDispatching;
import com.google.devtools.simple.runtime.components.android.Canvas;
import com.google.devtools.simple.runtime.components.android.Form;
import com.google.devtools.simple.runtime.components.android.HorizontalArrangement;
import com.google.devtools.simple.runtime.components.android.Label;
import com.google.devtools.simple.runtime.events.EventDispatcher;


import java.util.Random;




public class PaintPotActivity extends Form implements HandlesEventDispatching {


private Canvas myCanvas; //creates a canvas object
private Label lblStatus; //creates a label that discusses the status of the program
private Button btnRed; //creates a button for red paint
private Button btnBlue; // "" for blue paint
private Button btnGreen; // "" for green paint


private Button btnWipe; //creates a button that wipes the screen clean
private Button btnDotSize; // creates a button that changes the dot size




// Variable (field) used to for displaying number of touches
int numTouches; //declares an integer that lists out the number of touches a user made


// The equivalent to a "main" method for App Inventor apps is the $define method.
void $define() { 


    //We are going to place the color buttons in a HorizontalArrangement
    HorizontalArrangement hr = new HorizontalArrangement(this);
    btnRed = new Button(hr); 
    btnBlue = new Button(hr);
    btnGreen = new Button(hr);


    //set their color
    btnRed.BackgroundColor(Color.RED);
    btnBlue.BackgroundColor(Color.BLUE);
    btnGreen.BackgroundColor(Color.GREEN);

    //set the button text
    btnRed.Text("Red");
    btnBlue.Text("Blue");
    btnGreen.Text("Green");


    //canvas into its own HorizontalArrangement
    hr = new HorizontalArrangement(this);
    myCanvas = new Canvas(hr);
    myCanvas.Width(400);
    myCanvas.Height(400);
    myCanvas.LineWidth(10);


    //Wipe and a label into its own HorizontalArrangement
    hr = new HorizontalArrangement(this);
    btnWipe = new Button(hr);
    btnWipe.Text("Wipe");


    lblStatus = new Label(hr);
    lblStatus.Text("  touchX/touchY:");


    // Register for events.  By the second argument can be any string.    The third argument must
    // exactly match the name of the event that you want to handle for that component.  When the event
    // happens, dispatchEvent will be called with these arguments.
    EventDispatcher.registerEventForDelegation(this, "JavaBridge", "Touched");
    EventDispatcher.registerEventForDelegation(this, "JavaBridge", "Click");
    EventDispatcher.registerEventForDelegation(this, "JavaBridge", "Dragged");
}


// Here is the event dispatcher for our app.  We need to Override the method for the Form
// superclass
@Override
public boolean dispatchEvent(Component component, String id, String eventName,
                             Object[] args) {

    //if the canvas is touched by a tapping finger
    if (component.equals(myCanvas) && eventName.equals("Touched")) {
        canvasTouced(((Float) args[0]).intValue(), ((Float) args[1]).intValue());
        return true;

        //if the canvas is touched by a dragging finger, paint the line this way
    } else if (component.equals(myCanvas) && eventName.equals("Dragged")) {
        drawLine(((Float) args[2]).intValue(),
                ((Float) args[3]).intValue(),
                ((Float) args[4]).intValue(),
                ((Float) args[5]).intValue());
        return true;

        //if the canvas is touched while the blue button is selected
    } else if (component.equals(btnBlue) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_BLUE);
        return true;

        //if the canvas is touched while the green button is selected
    } else if (component.equals(btnGreen) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_GREEN);
        return true;

        //if the canvas is touched while the red button is selected
    } else if (component.equals(btnRed) && eventName.equals("Click")) {
        myCanvas.PaintColor(COLOR_RED);
        return true;

        //if the wipe button is selected
    } else if (component.equals(btnWipe) && eventName.equals("Click")) {
        myCanvas.Clear();
        return true;
    }


    return false;
}




/**
 * This method will get the touched touchX, touchY coordinates and will then create a circle
 * of random radius (between 1 to 33) with the color that was selected (RED, BLUE or GREEN).
 * It will also display the touched touchX,touchY coordinates.
 * @param x current x
 * @param y current y
 */
private void canvasTouced(int x, int y) {


    myCanvas.DrawCircle(x, y, new Random().nextInt(33));
    lblStatus.Text("  touchX/touchY:" + x + "/" + y + " touches: " + ++numTouches);


}


/**
 * Method to draw line
 * @param prevX last touch x
 * @param prevY last touch y
 * @param touchX current x
 * @param touchY current y
 */
private void drawLine(int prevX, int prevY, int touchX, int touchY) {
    myCanvas.DrawLine(prevX, prevY, touchX, touchY);
 }


}
4

3 に答える 3

3

dispatchEventアプリケーションがイベントを発生させると呼び出されます。ボタンのクリックとアプリとのやり取りごとに、個別のイベントがスローされます。各 if ステートメントは、さまざまな種類のイベントの処理方法を決定しています。

ユーザーが画面上で指をタップまたはドラッグしたときではないはずです。線またはドットが作成されるかどうかを決定する同じコードは、線またはドットのサイズだけでなく、線またはドットの色も要求する必要があります。ドット、選択されたボタンの色に応じて

この場合、イベント間の状態は に保存されますmyCanvas- クリックするbtnBlueと、キャンバス上でペイントの色が青に設定され ( myCanvas.PaintColor(COLOR_BLUE);)、別のイベントが発生するのを待ちます。ユーザーがキャンバス上をドラッグすると、線が描画されます (最終的にはmyCanvas.DrawLine(prevX, prevY, touchX, touchY);)。状態を覚えているのでmyCanvas、青色で線を引きます。

于 2013-02-21T18:24:42.000 に答える
1

ユーザーがキャンバス上で指をタップまたはドラッグした場合のifステートメントは同じレベルにあります

まあ、私は間違っているかもしれませんが、the same levelあなたがユーザーの行動にある種の等しい重みを意味するのであれば、答えはイエスです。

ユーザーが画面上で指をタップまたはドラッグしたときではなく、作成される線または点を決定する同じコードで、線または点のサイズだけでなく、線または点の色も要求する必要があります。ドット、選択した色ボタンによって異なります

はい、そうすべきです。このためには、それに応じてプログラムする必要があります。

于 2013-02-21T18:08:29.920 に答える
1

これは、イベント処理の一般的な構造です。「同じレベル」の IF を、ユーザーが選択できるオプションと考えると役立つ場合があります。同じダイアログに 2 つのボタンがある場合、どちらがクリックされるかわからないため、通常はネストしません。

メソッドの名前 'dispatchEvent' は大きな手がかりです。このメソッドが行っていることは、イベントを受け取り、適切なコード パスを選択することだけです。通常、各 IF は単に方向転換して関数またはメソッドを呼び出します。そうしないと、ディスパッチ メソッドが巨大になる可能性があります。

すべての可能なメッセージに対して十分な大きさの列挙がある場合 (Win32 はこれを行います)、すべての IF の代わりに 'switch/case' ステートメントを使用して同じことを行うことができます。

于 2013-02-21T18:23:46.190 に答える