Android - поворот ImageView пальцем перемещает другие представления вокруг

Я изучаю Android около двух недель (эксперт по as2 / 3).

Я создал простой LinearLayout1, который содержит ImageView`, содержащий png виниловой пластинки (в основном круглый диск)

Я установил этот ImageView поворачивается, когда пользователь проводит по нему пальцем, как будто царапает запись.

Мой код, кажется, работает (не уверен, что это лучший способ, но он работает). Проблема в том, когда ImageView вращается, он перемещает другие виды. Я определил, что это потому, что мое круглое изображение на самом деле представляет собой квадрат с прозрачными углами. Именно эти углы подталкивают другие виды и заставляют запись отталкиваться от левой стороны экран, если у меня ImageView выровнено по левому краю.

Есть несколько попыток решить эту проблему в Интернете, но ни одной из них мне кажется, что это именно то, что мне нужно, а некоторые завернуты в примеры, настолько надежные, что я не могу понять, что из этого взять на моем начальном уровне.

Если бы кто-нибудь мог пролить свет на то, что я могу сделать, разрешите это, это было бы здорово.Я понимаю, что простого ответа может не существовать, но имейте в виду, что я новичок в Java и стараюсь сделать его максимально простым! Большое спасибо за любую помощь!

также, если бы кто-нибудь мог сказать мне, почему мне нужно вычесть 50 из поворота, чтобы заставить запись двигаться под точным местом, которого касается пользователь, это тоже будет полезно! см. это в методе updateRotation ().

Вот моя XML-разметка:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
   xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/baseView"
    android:background="#FFFFFFFF"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <ImageView
        android:id="@+id/turntable"
        android:src="@drawable/turntable"
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:layout_weight="1"/>

</LinearLayout>

и мой Java-код:

package com.codingfiend.android.turntable;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.widget.ImageView;
import android.widget.TextView;

public class Turntable extends Activity
{
    View baseView;
    ImageView turntable;
    TextView bottomText;

    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);

        baseView = (View)findViewById(R.id.baseView);
        turntable = (ImageView)findViewById(R.id.turntable);

        turntable.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() - turntable.getWidth() / 2, turntable.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.turntable);

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

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

РЕДАКТИРОВАТЬ

Это вызывает раздражение. Должен быть способ повернуть изображение, которое больше или больше, чем экран, без его масштабирования, чтобы все изображение оставалось на экране. Почему часть вращающегося изображения не может исчезнуть с экрана? Очень неприятно. Я попытался обернуть ImageView в FrameView , что частично помогло. Теперь я могу добавить другие представления, на которые это не повлияет, но у меня все еще не может быть достаточно большого диска, потому что ему не разрешено переходить границы экрана при его вращении. Я не понимаю почему. Я еще не проверял расширение ImageView . Любые другие мысли будут оценены по достоинству!

10
задан midhunhk 19 July 2012 в 10:02
поделиться