Android - 用手指旋转 ImageView 会移动其他视图

10

我已经学习Android大约两周了(是as2/3的专家)。

我创建了一个简单的 LinearLayout,其中包含一个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的方法。如果有其他想法仍将不胜感激!


1
+1 很好的提问。欢迎来到 SO。 - wheaties
3个回答

3

实际上这是因为您试图在线性布局中旋转视图。这将导致其专用空间扩展或收缩。

建议1:尝试使用框架布局并在其中旋转您的视图。 建议2:尝试使用自定义视图子类,在onDraw中绘制您的转盘。在互联网上查找一个指南针绘制示例作为起点。


谢谢,我现在会尝试你的建议。很快就会回来告诉你结果。 - Ribs
1
使用框架布局已经解决了部分问题,因为现在我可以添加其他视图,这些视图不会受到旋转的ImageView的影响。但是,如果我将旋转的ImageView放在屏幕边缘或者它的宽度与屏幕一样宽,当旋转时,图像仍然会被其角落推动。 - Ribs
使用帧布局和自定义视图类覆盖onDraw()方法的组合是有效的。仍然存在一些意外行为,但我认为现在与问题无关。 - Ribs
1
此外,它似乎比我的原始代码高效多次。 - Ribs

0

简单明了,只需在画布上绘制一个圆形并将您的图像添加到画布中。画布图像将没有角落。此外,使用FrameLayout将一张图片放在另一张图片的上方,这将解决您的问题。


0

通过以下方式修复你的 imageView

imageview.setScaleType(ScaleType.CENTER);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接