Android – 用手指旋转ImageView可以移动其他视图

我已经学习了大约两个星期的Android(as2 / 3的专家)。

我已经创build了一个简单的LinearLayout1, which contains an ImageView`,包含一个黑胶唱片(基本上只是一个圆形的盘)

当用户在上面拖动一个手指时,我已经设置了这个ImageView旋转,就像抓一条logging一样。

我的代码似乎正在工作(不知道如果它是最好的方式,但它的工作原理)。 问题是当ImageView被旋转时,它会推动其他视图。 我已经确定这是因为我的圆形图像真的是一个带有透明angular的正方形。 正是这些angular落正在推动其他视图,并导致logging推离屏幕的左侧,如果我有ImageView左alignment。

有几个尝试在网上解决这个问题,但没有一个看起来像我所需要的那样,有些是用实例来包装的,所以我不能从我的初始层面看出它应该采取什么措施。

如果有人能够说明我能做些什么,那么解决这个问题就太好了。 我意识到一个简单的答案可能不存在,但请记住,我是一个Java noob,并尽可能保持简单! 非常感谢您的帮助!

如果有人可以告诉我为什么我需要从旋转中减去50,以使logging移动到用户触摸的确切位置,那也是有帮助的! 请参阅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呢。 任何其他的想法仍然将不胜感激!

Solutions Collecting From Web of "Android – 用手指旋转ImageView可以移动其他视图"

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

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

修复你的imageview

imageview.setScaleType(ScaleType.CENTER);

简单明了,只需画一个圆圈canvas,然后将图像添加到canvas上即可。canvas图像不会有angular落。 此外,使用FrameLayout将一个图像放在另一个上面,这将解决您的问题