Android - вращение ImageView пальцем перемещает другие виды вокруг - PullRequest
10 голосов
/ 11 декабря 2010

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

Я создал простой LinearLayout1, which contains an 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);
    }
}

EDIT

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

Ответы [ 3 ]

3 голосов
/ 11 декабря 2010

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

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

0 голосов
/ 23 декабря 2016

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

0 голосов
/ 04 января 2011

Исправьте ваш imageview

imageview.setScaleType(ScaleType.CENTER);

...