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

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

Я создал простой LinearLayout1, which contains anImageView', содержащий png виниловой записи (просто круговой диск в основном)

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

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

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

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

кроме того, если кто-нибудь может сказать мне, почему мне нужно вычесть 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 еще. Любые другие мысли все равно будут оценены!

3 ответов


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

Идея 1: Попробуйте использовать макет рамки, и ваш вид вращается внутри Идея 2: попробуйте пользовательский подкласс представления и нарисуйте свой проигрыватель в onDraw. В интернете найдите пример рисования компаса для запуска.


исправить imageview by

imageview.setScaleType(ScaleType.CENTER);


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