Подтвердить что ты не робот

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

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

Я создал простой LinearLayout1, which contains an ImageView`, содержащий 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. Любые другие мысли по-прежнему будут оценены!

4b9b3361

Ответ 1

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

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

Ответ 2

Исправьте imageview

imageview.setScaleType(ScaleType.CENTER);

Ответ 3

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