填充了多少画布

时间:2011-12-15 18:59:42

标签: java android floating-point

好的,

我正在尝试创建一个具有Scratch off功能的应用程序(比如从loto中删除门票)。

我一直在挖掘,无法找到一种方法来判断我的父母/颜色覆盖了多少画布。看看我想要的是他们必须先揭开背景图片的x%才能“点击”声称。

我确实找到了原始问题的答案。但是一个新的问题出现了同样的问题。

计算出百分比“int percent =(trans_count / max_count)* 100;”它总是返回0并且在我的应用程序中max_count总是90000(因为图片大小和我的机器人屏幕)。

这是我目前的代码。

class TouchView extends ImageButton {
    public Boolean Clickable = false;


    private Bitmap bgr = null;
    private Bitmap overlayDefault;
    private Bitmap overlay;
    private Paint pTouch;
    private int X = -100;
    private int Y = -100;
    private Canvas c2;

    public TouchView(Context context) { super(context);  build();}

    public TouchView(Context context, AttributeSet attrs) { super(context, attrs); build(attrs); }

    public TouchView(Context context, AttributeSet attrs, Integer params) { super(context, attrs, params);   build(attrs);}

    private void build()
    {
        bgr = BitmapFactory.decodeResource(getResources(),R.drawable.loser);
        overlayDefault = BitmapFactory.decodeResource(getResources(),R.drawable.over);
        overlay = BitmapFactory.decodeResource(getResources(), R.drawable.over).copy(Config.ARGB_8888, true);

        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
        pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setMaskFilter(new BlurMaskFilter(2, Blur.NORMAL));
        pTouch.setStrokeWidth(20);
    }

    private void build(AttributeSet attrs)
    {
        bgr = BitmapFactory.decodeResource(getResources(),R.drawable.loser);
        overlayDefault = BitmapFactory.decodeResource(getResources(),R.drawable.over);
        overlay = BitmapFactory.decodeResource(getResources(), R.drawable.over).copy(Config.ARGB_8888, true);

        pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);
        pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT));
        pTouch.setColor(Color.TRANSPARENT);
        pTouch.setMaskFilter(new BlurMaskFilter(2, Blur.NORMAL));
        pTouch.setStrokeWidth(20);
    }

    public void setAsWinner() {
        bgr = BitmapFactory.decodeResource(getResources(), R.drawable.winner);
    }

    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        int sX = X;
        int sY = Y;
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();
                c2.drawCircle(X, Y, 5, pTouch);
                break;
            }
            case MotionEvent.ACTION_MOVE: {
                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();
                c2.drawLine(sX, sY, X, Y, pTouch);
                break;
            }
            case MotionEvent.ACTION_UP:
                X = (int) ev.getX();
                Y = (int) ev.getY();
                invalidate();
                c2.drawLine(sX, sY, X, Y, pTouch);
                break;
        }

        try
        {
            int pixels[] = new int[(overlay.getWidth() * overlay.getHeight())];
            overlay.getPixels(pixels, 0, overlay.getWidth(), 0, 0, overlay.getWidth(), overlay.getHeight());
            int max_count = pixels.length;
            int trans_count = 0;

            for(int i = 0 ; i < max_count; i++)
            {
                if (pixels[i] == 0)
                    trans_count++;
            }

            int percent = (trans_count / max_count) * 100;

            if (percent > 60)
            {
                Clickable = true;
            }
        }
        catch (IllegalArgumentException e)
        {
            Log.i ("info", e.getMessage());
        }
        catch (ArrayIndexOutOfBoundsException e)
        {
            Log.i ("info", e.getMessage());
        }

        return true;
    }


    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // draw background
        if (bgr != null)
            canvas.drawBitmap(bgr, 0, 0, null);

        if (c2 == null)
        {
            int width = overlay.getWidth();
            int height = overlay.getHeight();

            RectF bounds = new RectF(canvas.getClipBounds());

            float scaleWidth = bounds.width() / width;
            float scaleHeight = bounds.height() / height;

            // create a matrix for the manipulation
            Matrix matrix = new Matrix();
            // resize the bit map
            matrix.postScale(scaleWidth, scaleHeight);


            overlay = Bitmap.createBitmap(overlay,0, 0, width, height, matrix, true);
            c2 = new Canvas(overlay);
        }

        canvas.drawBitmap(overlay, 0, 0, null);
    }

}

1 个答案:

答案 0 :(得分:1)

trans_countmax_count是整数,因此当您执行trans_count/max_count时,java执行整数除法,结果为0,因为trans_count小于max_count。你想要的是浮点除法,你可以这样强制它:

double percentage = 100.0 * trans_count / max_count;

基本上会发生的事情是100.0 * trans_count将首先执行浮点值(因为其中一个值是浮点值),然后结果将被max_count再次划分给出浮动点值。