Матричное масштабирование 5 уровня переменных - PullRequest
0 голосов
/ 30 января 2012

У меня 5 переменных.

Ширина и высота растрового изображения.Ширина и высота экрана.Требуемый процент

Как сделать растровое изображение нужным процентом экрана с помощью матрицы (т. Е. 1,0 нормальный, 0,5 полуразмера, 2,0 двойного размера).

Растровые изображения - это спрайты, которыеразная ширина кадра (IE взрыв 200x4000 (20 кадров 200x200, в то время как объект 65x195, поэтому 65x65 на объект, если это помогает).

Моя цель - передать что-то в ResizeBitmap, например (Bitmap, 100)100% экрана при сохранении соотношения сторон.

Таким образом, ResizeBitmap (Bitmap, 10) сделает его 10% экрана.

Это то, что я получил до сих пор, этосбои показывают неправильные размеры.

public Bitmap ResizeBitmap(Bitmap bitmap, int screen_percentage)
{   
    float scale;

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();

    float percentage_of_screen;
    float percentage_of_percentage_screen;

    if(screen_width > screen_height)
    {
        percentage_of_screen = (screen_width / 100) * width;
        percentage_of_percentage_screen = (screen_width / 100) * screen_percentage;
        scale = percentage_of_screen / percentage_of_percentage_screen;
    }

    else
    {
        percentage_of_screen = (screen_height / 100) * height;
        percentage_of_percentage_screen = (screen_height / 100) * screen_percentage;
        scale = percentage_of_screen / percentage_of_percentage_screen;
    }

    // CREATE A MATRIX FOR THE MANIPULATION
    Matrix matrix = new Matrix();

    // RESIZE THE BIT MAP
    matrix.postScale(scale, scale);

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

    return resizedBitmap;
}

Может кто-нибудь исправить мой код или хотя бы помочь мне, потому что я потратил столько времени на эту функцию.

Спасибо.

1 Ответ

1 голос
/ 31 января 2012

Протестировано:

public class StackOverflowActivity extends Activity{

    private int screen_width;
    private int screen_height;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // in main.xml use an ImageView with android:id="@+id/img"
        ImageView view = (ImageView)findViewById(R.id.img);

        // in your drawables folder, put an image named circle.png
        Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.circle);

        Display display = getWindowManager().getDefaultDisplay(); 
        screen_width = display.getWidth();
        screen_height = display.getHeight();

        Bitmap scale = resizeBitmap(bmp, 100);

        view.setImageBitmap(scale);

    }

    public Bitmap resizeBitmap(Bitmap bitmap, int screen_percentage)
    {
            ////////////// IMPORTANT ////////////////////
            // Use '/ 100.0f' otherwise your percentage will be 0..
            // this will later on, cause the newWidth & newHeight to be 0 as well
            // which causes the app to crash
        float percentage = screen_percentage / 100.0f;

        float scale = screen_width / 100 * percentage;
        if(screen_width < screen_height)
        {
            scale = screen_height / 100 * percentage;
        }

        int newWidth = (int) (bitmap.getWidth() * scale);
        int newHeight = (int) (bitmap.getHeight() * scale);

            if(newWidth <= 0 || newHeight <= 0)
            { // Extra check, for invalid width/height
                Log.e("test", "invalid dimension ("+newWidth+"x"+newHeight+")");
                return bitmap;
            }
        return Bitmap.createScaledBitmap (bitmap, newWidth, newHeight, true);
    }
}

Чтобы избежать проблем с коэффициентом масштабирования, используйте его в main.xml

<ImageView
    android:id="@+id/img"
    android:background="@null"
    android:layout_height="fill_parent"
    android:layout_width="fill_parent"
    android:layout_gravity="center" 
    android:scaleType="centerInside"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...