2

私はこのクラスを持っています: 私の問題:

public class Example extends Activity implements OnClickListener{
    DrawView view1;
    Canvas canvas = new Canvas();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        view1 = new DrawView(this);
        setContentView(view1);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
    int x = (int) event.getX();
    int y = (int) event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            view1.setFirstCoord(x, y);
            break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
            view1.setSecondCoord(x, y);
            view1.dispatchDraw(canvas);
            break;
        }
    return true;
    }

    public class DrawView extends LinearLayout {
        private Paint paint = new Paint();
        public int x1, x2;
        public int y1, y2;

        public DrawView(Context c){
            super(c);           
            LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            addView(inflater.inflate(R.layout.union, null));

            x1 = 0;
            x2 = 0;
            y1 = 0;
            y2 = 0;

            paint.setColor(Color.BLACK);
            paint.setAntiAlias(true);
            paint.setDither(true);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeWidth(10);        
        }

        @Override
        public void dispatchDraw(Canvas canvas) {
            super.dispatchDraw(canvas);
            canvas.drawLine(0, 50, 900,2000 , paint);//WORKS
            canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);//NO WORKS
        }

        public void setFirstCoord(int e, int f){
            x1 = e;
            y1 = f;
        }

        public void setSecondCoord(int e, int f){
            x2 = e;
            y2 = f;
        }
    }
}

次の行が実行されると、スクリーンに「example」行が表示されます。

canvas.drawLine(0, 50, 900,2000 , paint);

しかし、次の行が「実行」されると、直線は描かれません。どうして???

canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);

私も試しました:

canvas.drawLine(x1, y1, x2, y2, paint);

しかし、明らかに、結果は同じです。

onDraw() メソッドも実行してみましたが、onDraw は「UI」の下 (レイアウト .xml ファイルのコンテンツの下) にペイントするため、すべての行がペイントされます。

私を助けてくれる人が見つかることを願っています。解決策は非常に簡単だと思いますが、解決策が見つからないまま、夢中になってしまいます。

ありがとう!!!

ソリューション:

public class Example extends Activity implements OnClickListener{
    DrawView view1;
    Canvas canvas = new Canvas();

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);   
        view1 = new DrawView(this);
        setContentView(view1);
        view1.setOnClickListener(this);
    }

    public class DrawView extends LinearLayout {
        private Paint paint = new Paint();
        public int x1, x2;
        public int y1, y2;

        public DrawView(Context c){
            super(c);           
            LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            addView(inflater.inflate(R.layout.union, null));

            x1 = 0;
            x2 = 0;
            y1 = 0;
            y2 = 0;

            paint.setColor(Color.BLACK);
            paint.setAntiAlias(true);
            paint.setDither(true);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeJoin(Paint.Join.ROUND);
            paint.setStrokeWidth(10);        
        }

        public boolean onTouchEvent(MotionEvent event) {
        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            view1.setFirstCoord(x, y);
            break;
        case MotionEvent.ACTION_MOVE:
            break;
        case MotionEvent.ACTION_UP:
            view1.setSecondCoord(x, y);
            view1.onDraw(canvas);
            view1.postInvalidate();
            break;
        }
        return true;
        }

        public void setFirstCoord(int e, int f){
            x1 = e;
            y1 = f;
        }

        public void setSecondCoord(int e, int f){
            x2 = e;
            y2 = f;
        }

        public void onDraw(Canvas canvas){
        canvas.drawLine((int) x1, (int) y1,(int) x2,(int) y2, paint);
    }
    }
}

あなたの助けとあなたの注意に再び感謝します. 喜んで!!!

4

4 に答える 4

1
  • OnTouchEventをアクティビティではなくDrawViewに移動します
  • DrawViewをLinearLayoutではなくViewを拡張する
  • dispatchDrawの代わりに、メソッドonDrawを実装し、onTouchEventでinvalidate()を呼び出します。
于 2012-10-22T20:26:01.723 に答える
1

これにOnClickListenerインターフェースを使用する場合は、アクティビティをOnClickListenerビューのとして設定する必要があります。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);   
    view1 = new DrawView(this);
    setContentView(view1);

    // Add this:
    view1.setOnClickListener(this);
}

それ以外の場合は、onTouchEvent呼び出されません。

また、onTouchEventという名前を付ける必要がありますonClick

于 2012-10-22T20:19:13.547 に答える
1

描画コードをディスパッチ ドローに配置する代わりに、onDraw に配置してみてください。

次に、onTouch メソッドを次のように変更します。

@Override
public boolean onTouchEvent(MotionEvent event) {
  int x = (int) event.getX();
  int y = (int) event.getY();
  switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
    view1.setFirstCoord(x, y);
    break;
    case MotionEvent.ACTION_MOVE:
    break;
    case MotionEvent.ACTION_UP:
    view1.setSecondCoord(x, y);
    view1.postInvalidate();
    break;
  }
   return true;
}
于 2012-10-22T20:21:46.780 に答える
0

問題は、アクティビティで取得するx / y座標が画面スペースにあり、キャンバス上の描画座標がキャンバススペースにあることだと思います。

したがって、アクティビティの(0,0)は、キャンバスの(0,0)と同じ場所ではありません。

おそらく、アクティビティではなくビュー内でタッチイベントを受け取る必要があります。そうすると、座標系はタッチイベントとキャンバス描画の両方で同じになります。

于 2012-10-22T20:26:40.020 に答える