Обновлено: поворот растрового изображения, превышающего размер экрана.

Мое изображение больше, но на экране должна отображаться только его часть. Я сделал это. Моя проблема в том, что изображение нужно вращать пальцем. Приведенный ниже код работает так, как должен, на маленьком изображении. Но на моем изображении он ведет себя неправильно, перемещая изображение вверх и вниз и странно поворачивая его. Как заставить мое изображение нормально вращаться?, как маленькое изображение. Тогда я должен быть в состоянии получить цвет коснулся. Я получаю ответ здесь, но мне еще нужно над этим поработать. Но сначала подскажите, пожалуйста, как мне решить проблему с вращением, и если у вас есть идеи по поводу второго вопроса, касания цвета, хотелось бы их услышать.

это изображение:

это изображение

вот как это должно выглядеть на экране:

вот как это должно выглядеть на экране

Макет XML:

<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:

 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);
}

ОБНОВЛЕНИЕ: Поскольку я ничего не добился с Bitmap и Matrix, я попытался настроить RotateAnimtaion(), чтобы получить что-то максимально похожее. Я думаю, изменив второй параметр и продолжительность анимации, мы можем получить аналогичный результат, не меняя положение Y. Теперь проблема в том, что изображение кропится, думаю из-за scaleType="center". Вышлю код и скрин. Можно ли это улучшить?

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);

введите здесь описание изображения


person AlexAndro    schedule 02.07.2012    source источник
comment
Попробуйте с android:scaleType=fitXY вместо android:scaleType=center   -  person Aerrow    schedule 02.07.2012
comment
@Aerrow.. scaleType=fitXY растягивает изображение, и я этого не хочу, но я все равно пробовал, и у меня такое же поведение   -  person AlexAndro    schedule 02.07.2012


Ответы (2)


просто объявите Bitmap глобально, как:

private WeakReference<Bitmap> bitmap;

и использовать

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

вместо

bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);
person ρяσѕρєя K    schedule 02.07.2012
comment
Если я это сделаю, я больше не смогу использовать bitmap.getWidth() и bitmap.getHeight() в updateRotation() - person AlexAndro; 02.07.2012
comment
@AlexAndro: WeakReference, если это еще один способ избежать утечки памяти. Если ваше приложение работает с ответом @Andro, тогда хорошо, но вы должны попытаться объявить Bitmap как WeakReference - person ρяσѕρєя K; 02.07.2012

Я думаю, проблема в том, что вы пытаетесь перерисовать одно и то же растровое изображение при каждом вызове updateRotation().

Как насчет удаления этой строки,

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

из updateRotation(double rot) и объявить его глобально, так что вам не нужно снова и снова создавать один и тот же растровый рисунок, поэтому вы получаете OutOfMemory.

Попробуй это,

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);
}
person Andro Selva    schedule 02.07.2012
comment
Тот же странный эффект. Изображение перемещается (эффект перевода) вверх и вниз, когда вы пытаетесь его повернуть, изменяя его положение Y, это то, что меня больше всего раздражает. Затем изображение стремится прийти в исходное положение. - person AlexAndro; 02.07.2012
comment
Если смотреть очень внимательно, кажется, что само вращение получает перевод Y, даже с маленьким изображением, но по крайней мере маленькое изображение вращается, большое .... - person AlexAndro; 02.07.2012