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();
}