AlexAndro
AlexAndro

Reputation: 1928

Updated: Rotate a bitmap that exceeds screen size

My image is bigger, but just a part of it have to be displayed on the screen. I have done this. My problem is that, the image has to be rotated by finger. The code below works as it should on a small image. But on my image it has a wrong behave, repositioning the image up and down and rotate it weirdly. How to make my image to rotate normally?, as a small image. Then I have to be able to get the color touched. I get an answer here, but I still have to work at it. But first, please tell me how could I solve the problem with rotation, and if you have ideas about the second issue, with getting the color touched I would like to hear them.

this is the image:

this is the image

this is how it should appear on the screen:

this is how it should appear on the screen

XML Layout:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<ImageView android:id="@+id/imag"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:src="@drawable/roata"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="-200dp"
    android:scaleType="center"/>
 </RelativeLayout>

Java code:

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

    picture = (ImageView)findViewById(R.id.imag);
    picture.setOnTouchListener(onTableTouched);
}

public android.view.View.OnTouchListener onTableTouched = new android.view.View.OnTouchListener()
{
    public boolean onTouch(View v, MotionEvent evt)
    {
        double r = Math.atan2(evt.getX() - picture.getWidth() / 2, picture.getHeight() / 2 - evt.getY());
        int rotation = (int) Math.toDegrees(r);


        if (evt.getAction() == MotionEvent.ACTION_DOWN)
        {
            //
        }

        if (evt.getAction() == MotionEvent.ACTION_MOVE)
        {
           updateRotation(rotation);
        }

        if (evt.getAction() == MotionEvent.ACTION_UP)
        {
            //
        }

        return true;
    }
};

private void updateRotation(double rot)
{
    float newRot = new Float(rot);

    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);

    Matrix matrix = new Matrix();
    matrix.postRotate(newRot - 50);

    Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    picture.setImageBitmap(redrawnBitmap);
}

UPDATE: Because I got nowhere with Bitmap and Matrix I tried to adjust the RotateAnimtaion() to get something as similar as I could. I think modifying the second param and the duration of the animation dynamic, we can get a similar result without changing the Y position. Now, the problem is that the image is crop, I think because of scaleType="center". I will post code and a screen shoot. Could this be improved?

Animation a = new RotateAnimation(0.0f, param,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);
    a.setFillEnabled(true);
    a.setFillAfter(true);
    a.setDuration(param);

  picture.startAnimation(a);

enter image description here

Upvotes: 1

Views: 604

Answers (2)

Andro Selva
Andro Selva

Reputation: 54322

I think the problem is , you are trying to redraw the same Bitmap in every updateRotation() call.

How about removing this line,

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);

from updateRotation(double rot) and have it declared globally , so that you need not create the same Bitmap again and again which is why you are getting the OutOfMemory.

Try this,

Bitmap bitmap=null;
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    picture = (ImageView)findViewById(R.id.imag);
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);
    picture.setOnTouchListener(onTableTouched);
}


public android.view.View.OnTouchListener onTableTouched = new android.view.View.OnTouchListener() {
    public boolean onTouch(View v, MotionEvent evt) {
        double r = Math.atan2(evt.getX() - picture.getWidth() / 2, picture.getHeight() / 2 - evt.getY());
        int rotation = (int) Math.toDegrees(r);

        if (evt.getAction() == MotionEvent.ACTION_DOWN) {
            //
        }

        if (evt.getAction() == MotionEvent.ACTION_MOVE) {
           updateRotation(rotation);
        }

        if (evt.getAction() == MotionEvent.ACTION_UP) {
            //
        }

        return true;
    }
};

private void updateRotation(double rot) {
    float newRot = new Float(rot);

    Matrix matrix = new Matrix();
    matrix.postRotate(newRot - 50);

    Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
    picture.setImageBitmap(redrawnBitmap);
}

Upvotes: 1

ρяσѕρєя K
ρяσѕρєя K

Reputation: 132972

just declare Bitmap as globally as:

private WeakReference<Bitmap> bitmap;

and use

bitmap =new WeakReference(BitmapFactory.decodeResource(getResources(), R.drawable.roata));

instead of

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);

Upvotes: 1

Related Questions