我的图片更大,但只有一部分必须在屏幕上显示。我做到了这一点。我的问题是,图像必须用手指旋转。下面的代码在小图像上工作。但在我的图像上它有一个错误的行为,上下重新定位图像并奇怪地旋转它。如何使我的图像正常旋转?,作为一个小图像。然后我必须能够触摸颜色。我得到了答案here,但我仍然需要努力。但首先,请告诉我如何通过旋转解决问题,如果您对第二个问题有所了解,触摸颜色我想听听它们。
这是图片:
它应该出现在屏幕上:
XML布局:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ImageView android:id="@+id/imag"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:src="@drawable/roata"
android:layout_alignParentBottom="true"
android:layout_marginBottom="-200dp"
android:scaleType="center"/>
</RelativeLayout>
Java代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
picture = (ImageView)findViewById(R.id.imag);
picture.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() - picture.getWidth() / 2, picture.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.roata);
Matrix matrix = new Matrix();
matrix.postRotate(newRot - 50);
Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
picture.setImageBitmap(redrawnBitmap);
}
更新
因为Bitmap
和Matrix
我无处可去,所以我尝试调整RotateAnimtaion()
以获得尽可能相似的内容。我认为修改第二个参数和动画动态的持续时间,我们可以在不改变Y位置的情况下获得类似的结果。现在,问题是图像是裁剪的,我想是因为scaleType="center"
。我会发布代码和屏幕截图。这可以改进吗?
Animation a = new RotateAnimation(0.0f, param,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
0.5f);
a.setFillEnabled(true);
a.setFillAfter(true);
a.setDuration(param);
picture.startAnimation(a);
答案 0 :(得分:1)
我认为问题是,你试图在每次updateRotation()调用中重绘相同的Bitmap。
如何删除此行,
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);
来自updateRotation(double rot)
的并将其全局声明,因此您无需一次又一次地创建相同的Bitmap,这就是您获取OutOfMemory的原因。
试试这个,
Bitmap bitmap=null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
picture = (ImageView)findViewById(R.id.imag);
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);
picture.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() - picture.getWidth() / 2, picture.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);
Matrix matrix = new Matrix();
matrix.postRotate(newRot - 50);
Bitmap redrawnBitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
picture.setImageBitmap(redrawnBitmap);
}
答案 1 :(得分:1)
只需将Bitmap声明为全局:
private WeakReference<Bitmap> bitmap;
并使用
bitmap =new WeakReference(BitmapFactory.decodeResource(getResources(), R.drawable.roata));
而不是
bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.roata);