sacar porciento porcentajes porcentaje numero notas dinero descargar cómo con comun como cantidad calcular calculadora android canvas bitmap paint touch-event

porciento - ¿Cómo calcular el porcentaje de área borrada de un mapa de bits en Android?



descargar calculadora con porcentaje (1)

El problema es que no está llamando a su método PaintObjectInit() , por lo que está pintando con una pintura predeterminada, por lo que pinta en Color.BLACK en lugar de Color.TRANSPARENT . Agregue una llamada a PaintObjectInit() en la parte inferior de su constructor y debería funcionar.

¡Además, lo siguiente crea un mapa de bits inmutable! Ver createBitmap . Por lo tanto, su mapa de bits nunca se modifica. Está ocultando este hecho en la interfaz de usuario dibujando la ruta así como el mapa de bits.

// "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); return resizedBitmap;

Intenta hacer un mapa de bits mutable como este -

// "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(resizedBitmap); c.setMatrix(matrix); c.drawBitmap(bm, matrix, null); return resizedBitmap;

Soy nuevo en Android. Estoy haciendo una aplicación que puede borrar el mapa de bits en el lienzo usando el dedo. Algo así como el borrador de la pintura con los dedos. Quiero calcular el porcentaje de área borrada (por ejemplo, el 60% ha sido borrado de la imagen completa). Por favor, ayúdenme a hacer esto ... Gracias de antemano ...

Intenté algún método. Siempre me da 0%. No funciona. Ver la parte inferior del código para ese método ...

Vista personalizada

public class MyView extends View { private final Paint mPaint; private Bitmap mBitmap; private Canvas mCanvas; private final Path mPath; private final Paint mBitmapPaint; private Bitmap eraseableBitmap; public MyView(Context context) { super(context); if (Build.VERSION.SDK_INT >= 11) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } mPaint = new Paint(); mPath = new Path(); mBitmapPaint = new Paint(Paint.DITHER_FLAG); } protected void PaintObjectInit() { mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeJoin(Paint.Join.ROUND); mPaint.setStrokeCap(Paint.Cap.ROUND); mPaint.setStrokeWidth(30); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); try { //mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888); eraseableBitmap = BitmapFactory.decodeResource(this.getResources(), R.drawable.tharu_rena_over).copy( Bitmap.Config.ARGB_8888, true); eraseableBitmap = getResizedBitmap(eraseableBitmap, h, w); mCanvas = new Canvas(eraseableBitmap ); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) { int width = bm.getWidth(); int height = bm.getHeight(); float scaleWidth = ((float) newWidth) / width; float scaleHeight = ((float) newHeight) / height; // CREATE A MATRIX FOR THE MANIPULATION Matrix matrix = new Matrix(); // RESIZE THE BIT MAP matrix.postScale(scaleWidth, scaleHeight); // "RECREATE" THE NEW BITMAP Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false); return resizedBitmap; } @Override protected void onDraw(Canvas canvas) { //canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint); canvas.drawBitmap(eraseableBitmap, 0, 0, mBitmapPaint); canvas.drawPath(mPath, mPaint); } private float mX, mY; private static final float TOUCH_TOLERANCE = 4; private void touch_start(float x, float y) { // mPath.reset(); mPath.moveTo(x, y); mX = x; mY = y; } private void touch_move(float x, float y) { float dx = Math.abs(x - mX); float dy = Math.abs(y - mY); if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2); mX = x; mY = y; } } private void touch_up() { mPath.lineTo(mX, mY); // commit the path to our offscreen mCanvas.drawPath(mPath, mPaint); // kill this so we don''t double draw Toast.makeText(getContext(), "Deleted: " + percentTransparent(eraseableBitmap, 10), Toast.LENGTH_SHORT).show(); } @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: touch_start(x, y); invalidate(); break; case MotionEvent.ACTION_MOVE: touch_move(x, y); invalidate(); break; case MotionEvent.ACTION_UP: touch_up(); invalidate(); break; } return true; } static public float percentTransparent(Bitmap bm, int scale) { final int width = bm.getWidth(); final int height = bm.getHeight(); // size of sample rectangles final int xStep = width / scale; final int yStep = height / scale; // center of the first rectangle final int xInit = xStep / 2; final int yInit = yStep / 2; // center of the last rectangle final int xEnd = width - xStep / 2; final int yEnd = height - yStep / 2; int totalTransparent = 0; for (int x = xInit; x <= xEnd; x += xStep) { for (int y = yInit; y <= yEnd; y += yStep) { if (bm.getPixel(x, y) == Color.TRANSPARENT) { totalTransparent++; } } } return ((float) totalTransparent) / (scale * scale); } }

Clase de actividad interior onCreate

try { MyView myView = new MyView(this); myView.requestFocus(); myView.PaintObjectInit(); // setContentView(myView); LinearLayout upper = (LinearLayout) findViewById(R.id.LinearLayout01); upper.addView(myView); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }