Android Drawable объект, созданный программно, безобразен (масштабирование) - PullRequest
1 голос
/ 21 января 2012

Мне нужно создать собственный объект Drawable.Я хочу, чтобы этот пользовательский объект рисования отображал градиент, который будет применяться, например, в качестве фона представления.Для этого я переопределяю метод draw класса Drawable.Код моего класса CustomDrawable выглядит следующим образом:

public void draw(Canvas canvas) {
    Rect clipBounds = canvas.getClipBounds();
    Paint rectanglePaint = new Paint();

    LinearGradient lg = new LinearGradient(0,0,0,clipBounds.height(),0xff838383,0xff242424,Shader.TileMode.CLAMP);
    rectanglePaint.setShader(lg);

    RectF rectangle = new RectF(0f,0.0f, clipBounds.width(), clipBounds.height()); //in pixels
    canvas.drawRoundRect(rectangle, 0f, 0f, rectanglePaint);
}

Проблема возникает, когда я назначаю этот объект рисования в качестве фона моего окна в методе onCreate.Градиент появляется без проблем, но кажется, что он был масштабирован и выглядит ужасно.

Странно то, что я создаю эквивалентный объект рисования исключительно в XML и назначаю его непосредственно в качестве фона в макете XML IУ меня нет этого ужасного эффекта масштаба (я просто добавляю следующую строку "window.setFormat (PixelFormat.RGBA_8888);")

Почему у меня не получается такой же результат, когда я делаю это программно ??1008 *

Каждая идея будет по-настоящему оценена!Спасибо за чтение;)

1 Ответ

0 голосов
/ 25 марта 2014

Я неоднократно сталкивался с одной и той же проблемой в своих проектах, и каждый раз из-за нехватки времени (и лени) я был бы удовлетворен неоптимальным решением. Но недавно я нашел время для решения этой конкретной проблемы. Вот мое решение, и я надеюсь, что оно вам тоже поможет.

Bitmap scaleDownLargeImageWithAspectRatio(Bitmap image)
            {
                int imaheVerticalAspectRatio,imageHorizontalAspectRatio;
                float bestFitScalingFactor=0;
                float percesionValue=(float) 0.2;

                //getAspect Ratio of Image
                int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100);
                int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100);
                int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue();
                imaheVerticalAspectRatio=imageHeight/GCD;
                imageHorizontalAspectRatio=imageWidth/GCD;
                Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight);
                Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio);

                //getContainer Dimensions
                int displayWidth = getWindowManager().getDefaultDisplay().getWidth();
                int displayHeight = getWindowManager().getDefaultDisplay().getHeight();
               //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

                int leftMargin = 0;
                int rightMargin = 0;
                int topMargin = 0;
                int bottomMargin = 0;
                int containerWidth = displayWidth - (leftMargin + rightMargin);
                int containerHeight = displayHeight - (topMargin + bottomMargin);
                Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight);

                //iterate to get bestFitScaleFactor per constraints
                while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
                        (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight))
                {
                    bestFitScalingFactor+=percesionValue;
                }

                //return bestFit bitmap
                int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor);
                int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor);
                Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor);
                Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight);
                image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true);

                //Position the bitmap centre of the container
                int leftPadding=(containerWidth-image.getWidth())/2;
                int topPadding=(containerHeight-image.getHeight())/2;
                Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565);
                Canvas can = new Canvas(backDrop);
                can.drawBitmap(image, leftPadding, topPadding, null);

                return backDrop;
            }
...