我已经学习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 。任何其他想法仍然会受到赞赏!
答案 0 :(得分:3)
实际上这是因为您尝试以线性布局旋转视图。这将导致其专用空间扩大或缩小。
创意1:尝试使用框架布局,并在那里旋转视图 想法2:尝试自定义视图子类并在onDraw中绘制您的转盘。在互联网上寻找开始的指南针绘图示例。
答案 1 :(得分:0)
通过
修复您的imageview
imageview.setScaleType(ScaleType.CENTER);
答案 2 :(得分:0)
简单明了,只需绘制一个圆形画布并将图像添加到画布上。画布图像不会有角。此外,使用FrameLayout将一个图像放在另一个上面,这将解决您的问题