Non si può disegnare su canvas

Sto sviluppando un'attività di vernice, per favore esamini il codice che sto lavorando qui sotto:

public class MyTouchEventView extends LinearLayout { private Paint paint = new Paint(); private Path path = new Path(); private Paint circlePaint = new Paint(); private Path circlePath = new Path(); public Button btnReset; public Button btnSave; public LinearLayout.LayoutParams params; public MyTouchEventView(Context context) { super(context); paint.setAntiAlias(true); paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeWidth(15f); circlePaint.setAntiAlias(true); circlePaint.setColor(Color.BLUE); circlePaint.setStyle(Paint.Style.STROKE); circlePaint.setStrokeJoin(Paint.Join.MITER); circlePaint.setStrokeWidth(4f); btnReset = new Button(context); btnReset.setText("Clear Screen"); btnSave = new Button(context); btnSave.setText("Save Image"); params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); btnReset.setLayoutParams(params); btnSave.setLayoutParams(params); addView(btnReset); addView(btnSave); btnSave.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // resets the screen path.reset(); // Calls the onDraw() method postInvalidate(); } }); btnReset.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // resets the screen path.reset(); // Calls the onDraw() method postInvalidate(); } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path, paint); canvas.drawPath(circlePath, circlePaint); } @Override public boolean onTouchEvent(MotionEvent event) { // Gives you x and y coordinates on the Event. float pointX = event.getX(); float pointY = event.getY(); // Checks for the event that occurs switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(pointX, pointY); return true; case MotionEvent.ACTION_MOVE: path.lineTo(pointX, pointY); circlePath.reset(); // (circle's center x-coordinate, y-coordinate, radius of the // circle, direction to wind the shape) circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW); //circlePath.addRect(pointX - 25, pointY - 25, pointX + 25, pointY + 25, Path.Direction.CW); /* RectF rect = new RectF(pointX - 25, pointY - 25, pointX + 25, pointY + 25); circlePath.addRoundRect(rect, 0, 0, Path.Direction.CW); */ break; case MotionEvent.ACTION_UP: circlePath.reset(); break; default: return false; } // Schedules a repaint. // Force a view to draw. postInvalidate(); return true; } 

Ma il problema è che non posso disegnare su canvas. Che cosa mi manca qui? Qualsiasi aiuto e risposta sono veramente apprezzati. Grazie.

  • Android: come get il giorno corrente della settimana (lunedì, ecc ...) nella lingua dell'utente?
  • Come timeout acquisizione del segnale GPS
  • Android: Imansible avviare attività ComponentInfo {/ com.}: Android.view.InflateException: file binario di file XML Errore di gonfiaggio del frammento di class
  • Come faccio a corrispondere a una revisione di Google Play Services con una versione di installazione?
  • Come aprire i file in Android con il visualizzatore di default utilizzando jCIFS
  • Come get la latitudine e la longitudine di posizione in cui gli utenti appaiono sulla mappa in android
  • Perché usare il pacchettibile quando è ansible eseguire la stessa attività utilizzando le variables statiche?
  • Invia i dati postali al server utilizzando l'android Volley
  • Impostare la voce predefinita selezionata di ListView Alert Dialog in Android
  • Scorri in alto in RecyclerView con LinearLayoutManager
  • Il permesso è concesso solo all'applicazione di sistema
  • Android - Due ascoltatori onClick e un button
  • One Solution collect form web for “Non si può disegnare su canvas”

    Ho fatto solo alcune modifiche al tuo codice. Controllare il colpo di scatto

    activity_main.xml

      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_above="@+id/button1" android:id="@+id/rl" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_alignParentTop="true" > </RelativeLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_marginLeft="14dp" android:text="Clear" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_marginRight="32dp" android:text="Save" /> </RelativeLayout> 

    Attività principale

      public class MainActivity extends Activity { DrawingView dv ; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); dv = new DrawingView(this); setContentView(R.layout.activity_main); RelativeLayout rl = (RelativeLayout) findViewById(R.id.rl); rl.addView(dv); Button b = (Button) findViewById(R.id.button1); Button b1 = (Button) findViewById(R.id.button2); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub dv.clear(); // on button click clear the draw } }); // similarly you can save the draw. i have not added. // if you have trouble let me know } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } public class DrawingView extends View { private Paint paint = new Paint(); private Path path = new Path(); private Paint circlePaint = new Paint(); private Path circlePath = new Path(); public Button btnReset; public Button btnSave; public LinearLayout.LayoutParams params; public DrawingView (Context context) { super(context); paint.setAntiAlias(true); paint.setColor(Color.GREEN); paint.setStyle(Paint.Style.STROKE); paint.setStrokeJoin(Paint.Join.ROUND); paint.setStrokeWidth(15f); circlePaint.setAntiAlias(true); circlePaint.setColor(Color.BLUE); circlePaint.setStyle(Paint.Style.STROKE); circlePaint.setStrokeJoin(Paint.Join.MITER); circlePaint.setStrokeWidth(4f); } public void clear() { path.reset(); // Calls the onDraw() method invalidate(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawPath(path, paint); canvas.drawPath(circlePath, circlePaint); } @Override public boolean onTouchEvent(MotionEvent event) { // Gives you x and y coordinates on the Event. float pointX = event.getX(); float pointY = event.getY(); // Checks for the event that occurs switch (event.getAction()) { case MotionEvent.ACTION_DOWN: path.moveTo(pointX, pointY); return true; case MotionEvent.ACTION_MOVE: path.lineTo(pointX, pointY); circlePath.reset(); // (circle's center x-coordinate, y-coordinate, radius of the // circle, direction to wind the shape) circlePath.addCircle(pointX, pointY, 30, Path.Direction.CW); //circlePath.addRect(pointX - 25, pointY - 25, pointX + 25, pointY + 25, Path.Direction.CW); /* RectF rect = new RectF(pointX - 25, pointY - 25, pointX + 25, pointY + 25); circlePath.addRoundRect(rect, 0, 0, Path.Direction.CW); */ break; case MotionEvent.ACTION_UP: circlePath.reset(); break; default: return false; } // Schedules a repaint. // Force a view to draw. invalidate(); return true; } } } 

    Snap Shot

    immettere qui la descrizione dell'immagine

    Spiegazione

    Ho usato un layout relativo e posizionato i pulsanti di conseguenza.

    Ho usato un altro layout relativo con id rl. Aggiunta visualizzazione personalizzata allo stesso modo.

    Ho esteso una vista piuttosto che Layout lineare.

    Ho definito un metodo chiaro per eliminare il disegno che si chiama onClick di chiaro.

    Ho usato invalido per aggiornare il sorteggio.

    Modifica 2:

    Salvare:

    Nota: viene salvato solo il disegno. Puoi salvare l'integer schermo se vuoi.

    Aggiungi l'authorization in Manifest File

      <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 

    Utilizza il sotto per salvare

      Button b1 = (Button) findViewById(R.id.button2); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub AlertDialog.Builder editalert = new AlertDialog.Builder(MainActivity.this); editalert.setTitle("Please Enter the name with which you want to Save"); final EditText input = new EditText(MainActivity.this); LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); input.setLayoutParams(lp); editalert.setView(input); editalert.setPositiveButton("OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { rl.setDrawingCacheEnabled(true); String name= input.getText().toString(); Bitmap bitmap =rl.getDrawingCache(); String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/MyDraw"); myDir.mkdirs(); File file = new File (myDir, name+".png"); if (file.exists ()) file.delete (); try { if(!file.exists()) { file.createNewFile(); } FileOutputStream ostream = new FileOutputStream(file); bitmap.compress(CompressFormat.PNG, 10, ostream); // System.out.println("saving......................................................"+path); ostream.close(); rl.invalidate(); } catch (Exception e) { e.printStackTrace(); }finally { rl.setDrawingCacheEnabled(false); } } }); editalert.show(); } }); 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.