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

时间:2010-12-11 02:11:34

标签: android imageview rotation

我已经学习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);
    }
}

修改

这结果是一个令人恼火的问题。必须有一种方法来旋转与屏幕一样大或大的图像,而不会缩放,因此整个图像保留在屏幕上。为什么部分旋转图像不能脱屏?很沮丧。我尝试将 ImageView 打包成 FrameView ,这部分有帮助。现在我可以添加其他不受影响的视图,但我仍然无法让我的光盘足够大,因为它在旋转时不允许通过屏幕边框。我不明白为什么。我还没有检查过扩展 ImageView 。任何其他想法仍然会受到赞赏!

3 个答案:

答案 0 :(得分:3)

实际上这是因为您尝试以线性布局旋转视图。这将导致其专用空间扩大或缩小。

创意1:尝试使用框架布局,并在那里旋转视图 想法2:尝试自定义视图子类并在onDraw中绘制您的转盘。在互联网上寻找开始的指南针绘图示例。

答案 1 :(得分:0)

通过

修复您的imageview

imageview.setScaleType(ScaleType.CENTER);

答案 2 :(得分:0)

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