1

私はアンドロイドで開発していますがPaint、アンドロイド用にやる必要があります。

以下のコードを使用しています。コードを実行すると描画は機能しますが、ペイントするサーフェスが 2 つあるようで、一方を描画するともう一方が消えます。

正確なエラーを探していましたが、見つかりません。

コードは次のとおりです。

import java.util.Random; 

import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Path;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
 import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.RelativeLayout;

public class MainActivity extends Activity {
  MySurfaceView mySurfaceView;
  Button Cuadrado;
  Button Circulo;
  Button Color;
  Button Linea;
  private boolean Bcuadrado,Bcirculo,Bcolor=false;
  private boolean Blinea=true;
    Canvas canvas = new Canvas();

  @TargetApi(11)
@SuppressLint("NewApi")
@Override
  public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       RelativeLayout mainLayout =(RelativeLayout)findViewById(R.id.main_layout_id );
       View view =getLayoutInflater().inflate(R.layout.itemlayout, mainLayout,false);
       mainLayout.addView(view);
       mySurfaceView = new MySurfaceView(this);
       Cuadrado=(Button)findViewById(R.id.button1);
       Circulo=(Button)findViewById(R.id.button2);
       Color=(Button)findViewById(R.id.button3 );
       Linea=(Button)findViewById(R.id.button4 );
       int w= view.getWidth();
       int h= view.getHeight();
       float x=view.getX();
       float y= view.getY();
       mySurfaceView.setY(100);
       mainLayout.addView(mySurfaceView);
       Cuadrado.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if(Bcuadrado==false){
                Bcuadrado=true;
                Bcirculo=false;
                Bcolor=false;
                Blinea=false;
            }
        }
       });

       Circulo.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if(!Bcirculo){
            Bcuadrado=false;
            Bcirculo=true;
            Bcolor=false;
            Blinea=false;
        }
    }
   });

       Color.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        if(!Bcolor){
            Bcuadrado=false;
            Bcirculo=false;
            Bcolor=true;
            Blinea=false;
        }
    }
   });

       Linea.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
        if(!Blinea){
            Bcuadrado=false;
            Bcirculo=false;
            Bcolor=false;
            Blinea=true;
        }
    }
   });
}

  class MySurfaceView extends SurfaceView{
   Path path;
   SurfaceHolder surfaceHolder;
   volatile boolean running = false;        
   private Paint paint = new Paint();
   float x0=0;
    float x1=0;
    float y0=0;
    float y1=0;
    Random random = new Random();

   public MySurfaceView(Context context) {
    super(context);
    surfaceHolder = getHolder();
    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeWidth(3);
    paint.setColor(android.graphics.Color.WHITE);

   }

   @Override
   public boolean onTouchEvent(MotionEvent event) {


       if(Blinea){
            if(event.getAction() == MotionEvent.ACTION_DOWN){
             path = new Path();
             path.moveTo(event.getX(), event.getY());
            }else if(event.getAction() == MotionEvent.ACTION_MOVE){
             path.lineTo(event.getX(), event.getY());
            }else if(event.getAction() == MotionEvent.ACTION_UP){
             path.lineTo(event.getX(), event.getY());
            }
            if(path != null){
                 canvas = surfaceHolder.lockCanvas();
                 canvas.drawPath(path, paint);
                 surfaceHolder.unlockCanvasAndPost(canvas);
                }

       }else if(Bcuadrado){
           if(event.getAction()==MotionEvent.ACTION_DOWN){
               x0=event.getX();
               y0=event.getY();
           }
           else if(event.getAction()==MotionEvent.ACTION_UP){
               x1=event.getX();
               y1=event.getY();
               canvas = surfaceHolder.lockCanvas();
               canvas.drawRect(x0, y0, x1, y1, paint);
               surfaceHolder.unlockCanvasAndPost(canvas);
           }

       }else if(Bcirculo){
           if(event.getAction()==MotionEvent.ACTION_DOWN){
               x0=event.getX();
               y0=event.getY();
           }
           else if(event.getAction()==MotionEvent.ACTION_UP){
               x1=event.getX();
               canvas=surfaceHolder.lockCanvas();
               canvas.drawCircle(x0, y0,(x1-x0), paint);
               surfaceHolder.unlockCanvasAndPost(canvas);
           }
       }else if(Bcolor){
             int r = random.nextInt(255);
             int g = random.nextInt(255);
             int b = random.nextInt(255);
             canvas=surfaceHolder.lockCanvas();
             paint.setColor(0xff000000 + (r << 16) + (g << 8) + b);
             surfaceHolder.unlockCanvasAndPost(canvas);
       }


    return true; 
   }
  }
}
4

2 に答える 2

1

ペイントする面が2つあるようで、一方を描画するともう一方が消えます。

それがまさにそのSurfaceView仕組みです-それはダブルバッファリングされています。毎回フレーム全体を再描画する必要があります。

于 2012-12-15T20:47:45.037 に答える
0

Androidのドキュメントから:SurfaceHolder

サーフェスのコンテンツがunlockCanvas()とlockCanvas()の間で保持されることはありません。このため、サーフェス領域内のすべてのピクセルを書き込む必要があります。このルールの唯一の例外は、ダーティな長方形が指定されている場合です。この場合、ダーティでないピクセルが保持されます。

キャンバスには、以前に書き込んだ内容は保存されません。unlock()を呼び出すたびに、すべてを最初からやり直す必要があります。

于 2012-12-15T20:50:55.443 に答える