2012-12-15 157 views
1

我正在開發android,我必須爲android做一個Paint油漆帆布android

我使用下面的代碼,當我執行代碼時,繪圖工作,但是,似乎有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; 
    } 
    } 
} 

回答

1

似乎有2面作畫,當你在一個畫,另一個消失。

這正是SurfaceView的工作原理 - 它是雙緩衝。你需要每次重畫整個幀。

+0

「兩個表面」應該對代碼透明:每次只需重新繪製。 – RichieHH

0

從Android的文檔:SurfaceHolder

表面的內容不會保留unlockCanvas()和lockCanvas()之間,由於這個原因,表面區域內的每個像素必須寫。這條規則的唯一例外是指定了一個髒矩形,在這種情況下,將保留非髒像素。

畫布不會保存您之前寫入的內容。每次你打電話給unlock(),你都必須重新繪製一切。

+0

感謝這兩個答案,現在,有意義的「骯髒的矩形方法」:D –

+0

好吧,我有一個問題。我一整天都在做事,我無法修復它。我怎樣才能重新繪製一切?我嘗試繪製一個位圖,並將此位圖附加到我的畫布上,但沒有奏效。我嘗試OverWrite onDraw()方法,但這也不起作用。 –

+0

爲了使用onDraw()方法,您必須爲您的surfaceview調用setWillNotDraw(true)。你可以通過兩種方式解決這個問題。 1)以某種方式保存所有發生的更改,並使用每個onDraw()重新繪製它們。 2)看看使用此:http://stackoverflow.com/questions/4039024/draw-from-old-canvas-android –