سؤال

أحتاج إلى تدوير ImageView ببضع درجات. أقوم بذلك عن طريق التصنيف الفرعي ImageView والتحميل الزائد onDraw()

@Override
protected void onDraw(Canvas canvas) {
    canvas.save();
    canvas.scale(0.92f,0.92f);
    canvas.translate(14, 0);
    canvas.rotate(1,0,0);
    super.onDraw(canvas);
    canvas.restore();
}

المشكلة هي أن الصورة التي تنتج تُظهر مجموعة من jaggies.

http://img.skitch.com/20100608-gmdy4sexsm1c71di9rgiktdjhu.png

كيف يمكنني أن أقوم بتدوير ImageView الذي أحتاجه للتدوير من أجل القضاء على Jaggies؟ هل هناك طريقة أفضل للقيام بذلك؟

هل كانت مفيدة؟

المحلول

إذا كنت تعلم أن السحب الخاص بك هو bitmapdrawrawlable ، فيمكنك استخدام مكافحة التخزين في طلاء صورة نقطية للقيام بشيء مثل ما يلي:

/**
 * Not as full featured as ImageView.onDraw().  Does not handle 
 * drawables other than BitmapDrawable, crop to padding, or other adjustments.
 */
@Override
protected void onDraw(Canvas canvas) {
    final Drawable d = getDrawable();

    if( d!=null && d instanceof BitmapDrawable && ((BitmapDrawable)d).getBitmap()!=null ) {
        final Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
        final int paddingLeft = getPaddingLeft();
        final int paddingTop = getPaddingTop();

        canvas.save();

        // do my rotation and other adjustments
        canvas.scale(0.92f,0.92f);
        canvas.rotate(1,0,0);

        if( paddingLeft!=0 )
            canvas.translate(paddingLeft,0);

        if( paddingTop!=0 )
            canvas.translate(0,paddingTop);

        canvas.drawBitmap( ((BitmapDrawable)d).getBitmap(),0,0,p );
        canvas.restore();
    }
}

نصائح أخرى

اضبط ANTIALIAS و FILTERBITMAP على الطلاء الذي يرسم صورة نقطية. واجهت مشكلة مماثلة وهذا عمل بالنسبة لي:

Paint bitmapPaint = new Paint();
bitmapPaint.setAntiAlias(true);
bitmapPaint.setFilterBitmap(true);

فعلت ما يلي للحصول على العمل:

في AndroidManifest.xml لقد قمت بتمكين تسريع الأجهزة <application android:hardwareAccelerated="true">.

بدلاً من استخدام طريقة سحب مخصصة ، قمت بتغيير نوع الطبقة من عرض الوالدين إلى تسريع الأجهزة مع مكافحة التمكين وأضفت آراء بلدي الفرعية على النحو التالي:

Paint layerPaint =  new Paint();
layerPaint.setAntiAlias(true);
layerPaint.setFilterBitmap(true);
layerPaint.setDither(true);

RelativeLayout parentLayout = (RelativeLayout) LayoutInflater.from(context).inflate(R.layout.myLayout, null);
parentLayout.setLayerType(View.LAYER_TYPE_HARDWARE, layerPaint);

parentLayout.addView(myChildView);

يجب أن أضيف أن القطع لا يمكن تعطيله عند استخدام هذا النهج.

يحل هذا الدوران جزءًا واحدًا من المشكلة - حواف خشنة ، لكن الصورة بدلاً من ذلك أصبحت غريبة.

ifound حل واحد فقط حتى الآن: في Ondraw أو طريقة رسم الإرسال

        Bitmap bmp = ((BitmapDrawable)image.getDrawable()).getBitmap();
    double scale = (0.0+bmp.getWidth()+40.0)/getWidth();
    if (scale > 1){
        bmp = Bitmap.createScaledBitmap(bmp, getWidth()-40, (int) (bmp.getHeight()/scale), true);
    }

    canvas.drawColor(Color.TRANSPARENT); 
    canvas.save();

    canvas.translate(20, yShift);

    int left = borderSize;
    int top = borderSize;
    int right = bmp.getWidth() - borderSize;
    int bottom = bmp.getHeight() - borderSize;

    if(showText){
        mPaint.setColor(Color.WHITE);
        canvas.rotate(getAngel());
        canvas.drawRect(left, top, right, bottom, mPaint);

        canvas.translate(0,0);
        textFrame.draw(canvas);
    }else{
        // rotaed bitmap 
        mMatrix.setRotate(getAngel());

        // draw bitmap after creation of new rotated bitmap from rotated matrix
        canvas.drawBitmap(Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth(), bmp.getHeight(), mMatrix, true)
                   , 0, 0, mPaint);
    }
    canvas.restore();       

لقد عملت حل Primoz990 بالنسبة لي :) لقد قمت أيضًا بتمكين المخلصة ، لذا فإن الكود النهائي الذي يزيل الحواف المسننة على الدوران هو:

Paint bitmapPaint =  new Paint();
bitmapPaint.setAntiAlias(true);
bitmapPaint.setFilterBitmap(true);
bitmapPaint.setDither(true);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top