2016-05-23 19 views
0

In meiner Anwendung müssen Sie einen Kreis auf ein Bild zeichnen. Im Moment benutze ich Leinwand und die Canvas enthält dieses Bild. Meine Anforderung ist, dass ich zuerst einen Kreis mit Radius 20 zeichne, dann nach einer Sekunde den vorherigen Kreis lösche und einen Kreis mit 25 Kreisen zeichne und so weiter.Wie lösche ich den Canvas in Android?

Unten ist mein Fragment Code.

import android.app.Activity; 
    import android.content.pm.ActivityInfo; 
    import android.graphics.Color; 
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v4.app.FragmentManager; 
    import android.view.LayoutInflater; 
    import android.view.View; 
    import android.view.ViewGroup; 
    import android.widget.Button; 

    /** 
    * Created by user on 5/23/2016. 
    */ 
    public class StepTwentyOneFragment extends Fragment { 

     private CanvasView customCanvas; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
      View v = inflater.inflate(R.layout.step21_fragment, container, false); 
      customCanvas=(CanvasView)v.findViewById(R.id.signature_canvas); 

      final Button button1=(Button)v.findViewById(R.id.step18button1); 

      button1.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        if(v.getId()==R.id.step18button1){ 

         customCanvas.clear2(); 

         v.setBackgroundResource(R.drawable.button_border_5); 
         button1.setTextColor(Color.WHITE); 

        } 
       } 
      }); 





      return v; 
     } 

     public static StepTwentyOneFragment newInstance() { 

      StepTwentyOneFragment f = new StepTwentyOneFragment(); 
      Bundle b = new Bundle(); 

      f.setArguments(b); 

      return f; 
     } 


     @Override 
     public void setUserVisibleHint(boolean isVisibleToUser) { 
      super.setUserVisibleHint(isVisibleToUser); 
      if(isVisibleToUser) { 
       Activity a = getActivity(); 
       if(a != null) a.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
      } 
     } 

Unten ist, wie ich das Bild und den Kreis zeichnen. Meine Klasse erreichen diese Klasse.

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Path; 
import android.graphics.PorterDuff; 
import android.graphics.drawable.Drawable; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.Toast; 

/** 
* Created by user on 4/28/2016. 
*/ 
public class CanvasView extends View { 

    public int width; 
    public int height; 
    private Bitmap mBitmap; 
    private Canvas mCanvas; 
    private Path mPath; 
    Context context; 
    private Paint mPaint; 
    private float mX, mY; 
    private static final float TOLERANCE = 5; 

    public CanvasView(Context c, AttributeSet attrs) { 
     super(c, attrs); 
     context = c; 

     mPath = new Path(); 

     mPaint = new Paint(); 
     mPaint.setStrokeWidth(3); 
     mPaint.setColor(Color.CYAN); 
    } 

    // override onDraw 
    @Override 
    protected void onDraw(Canvas canvas) { 

     super.onDraw(canvas); 

     mCanvas=canvas; 

     Drawable d = getResources().getDrawable(R.drawable.circle_1); 

     int canvasHeight= canvas.getHeight(); 
     int canvasWidth= canvas.getWidth(); 

     Log.d("Height - ","/"+canvas.getHeight()); 
     Log.d("Width - ","/"+canvas.getWidth()); 

//   DisplayMetrics displaymetrics = new DisplayMetrics(); 
//  ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
//  int height = displaymetrics.heightPixels; 
//  int width = displaymetrics.widthPixels; 

     float h=canvasHeight/2; 
     float w=canvasWidth/2; 
     float r=(canvasWidth/2) - ((canvasWidth/2)/100)*20; 

     d.setBounds(0, 0, canvasWidth, canvasHeight); 
     d.draw(canvas); 

     canvas.drawCircle(w, h, r, mPaint); 
    } 

    public void clear2(){ 

     mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

     Drawable d = getResources().getDrawable(R.drawable.circle); 

     int canvasHeight= mCanvas.getHeight(); 
     int canvasWidth= mCanvas.getWidth(); 

     Log.d("Height - ","/"+mCanvas.getHeight()); 
     Log.d("Width - ","/"+mCanvas.getWidth()); 

//   DisplayMetrics displaymetrics = new DisplayMetrics(); 
//  ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displaymetrics); 
//  int height = displaymetrics.heightPixels; 
//  int width = displaymetrics.widthPixels; 

     float h=canvasHeight/2; 
     float w=canvasWidth/2; 
     float r=(canvasWidth/2) - ((canvasWidth/2)/100)*20; 

     d.setBounds(0, 0, canvasWidth, canvasHeight); 
     d.draw(mCanvas); 
     mCanvas.restore(); 

    } 

} 

aber das Problem ist, dass ich nicht in der Lage bin, die Canvas überhaupt zu löschen. Obwohl ich eine Methode namens clear2 habe, wird nichts gelöscht. Ich bin mir auch nicht sicher, wie ich den anderen Kreis zeichnen soll, wenn der Löschvorgang abgeschlossen ist. Ich glaube, dass dieser "Zeichnungs" Code in meiner Fragment Klasse sein muss? Bitte helfen Sie.

+1

Canvas.drawColor (Farbe.TRANSPARENT, PorterDuff.Mode.CLEAR) –

+0

@AmitVaghela: Bereits getan. – Barrier

Antwort

1

Sie können Ihre Pfad wie

mPath.reset(); 

danach setzen Sie Ihren neuen Pfad zeichnen.

Dies kann hilft Ihnen

+0

Kann diese Antwort mit mehr Details erklären? Weil das nicht funktioniert? – Barrier

0

Ich denke, man sollte sich das ändern:

mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 

zu

mCanvas.drawColor(Color.WHITE) 

Ich denke, es ist da ist, da Sie mit einem transparenten über die ganze Leinwand sind Zeichnung Farbe, wirkt sich dies nicht auf die Leinwand aus. Daher könntest du immer noch den vorherigen Frame sehen.

Verwandte Themen