android - 绘画 Canvas 机器人

标签 android canvas paint

我在 android 中开发,我必须为 android 做一个 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; 
   }
  }
}

最佳答案

it seems that there are 2 surfaces to paint, and when you draw in one, the other one disappears.

这正是 SurfaceView 的工作原理 - 它是双缓冲的。每次都需要重新绘制整个框架。

关于android - 绘画 Canvas 机器人,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895642/

相关文章:

c# - 如何使用现有的 ToolStripRenderer 绘制托管的 NumericUpDown?

android - EditText弹出报警/提醒系统的TimePicker

android - 我怎样才能永远重复过渡?

javascript - 如何从 Canvas 和 JS 中的输入旋转动态文本?

javascript - Canvas 使用字母而不是形状?

java - 为什么我的代码执行paintComponent(Graphics page)两次?

java - 鼠标点击java

java - GoogleCloudMessaging 未授权错误 401(Android 作为服务器)

java - 阻止 WebView 显示 "web page not available"

Android:如何使用 Canvas /绘制位图缩放位图以适合屏幕大小?