Android,如何围绕固定点旋转箭头(图像)?

时间:2011-09-14 08:56:19

标签: android image rotation point

我有一个箭头图像,我想从0度旋转到180度(就像一米中的针一样。)箭头的一个点固定在屏幕的中间和底部,箭头应该移动。箭头长度固定(是图像)。此外,我有两个按钮,我希望在触摸按钮时左箭头向左转,当触摸右按钮时向右转。

这个过程的逻辑是什么?

enter image description here

5 个答案:

答案 0 :(得分:5)

如果您使用画布进行绘图(在您的情况下应如此),这实际上非常简单。

鉴于你知道图像应该旋转的点的坐标,你可以这样做:

private void doDraw(Canvas canvas) {
canvas.save();
float px = ...;
float py = ...;
canvas.rotate(degrees, px, py);
arrow.draw(canvas);
canvas.restore();
}

度将是一个整数值,当用户单击L或R按钮时,您可以递增/递减。 canvas.rotate负责其余部分!

答案 1 :(得分:2)

你必须使用android中的3d旋转动画,并尝试使用矩阵旋转......我有这个位图代码.........

Bitmap bmp=BitmapFactory.decodeResource(getResources(), R.drawable.bar);
                Matrix mtx = new Matrix();
  mtx.postRotate(180);   // rotating 180 degrees clockwise
  Bitmap rotatedBMP = Bitmap.createBitmap(bmp, 0, 0, bmp.getWidth() ,bmp.getHeight() , mtx, true);  // creating the bitmap image with new angle

也请查看

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/Rotate3dAnimation.html

答案 2 :(得分:2)

所以答案很简短,答案很长。

简短的回答是位图和画布的旋转是一种常见的功能,通常称为“旋转”,通常采用旋转的点。

更长的答案是所有2D和3D图形都转化为矩阵代数的技巧。对于每一点:     new_x = factor_1 * old_x + factor_2 * old_y + factor_3     ...

这些因素在矩阵中非常有效,这也是矩阵事物如此受欢迎的原因。有一个很酷的技巧,你将转换链接在一起,所以你可能会把你的问题说成“拿走旧画布,移动它,使触摸的点是原点,旋转它,然后移动它,使原点回到原点感动的点。“或矩阵m =新矩阵()。postTranslate(-touch_x,-touch_y).postRotate(360/20).postTranslate(touch_x,touch_y)每次旋转1/20圈。然后将矩阵传递给任何采用“变换”矩阵的函数。

很酷的是,你只对该矩阵进行一次所有计算,然后在每个点上使用相同的4次乘法和一堆加法。事实上,这是如此常见,以至于视频卡和英特尔指令集都在硬件中完成这些工作。您也可以将生成的图像再次乘以相同的矩阵,以获得下一个。

现在,如果你真的要求图形黑客如何在一些没有内存的快速汇编代码中执行此操作,诀窍是选择旋转和错误到不需要缓冲区的小链中。例如,一个简单的90度旋转将首先交换四个角,然后它将交换(左上角+ 1左上角进入右上角+ 1下进入右下角 - 左边一个进入左下角 - 一个向下,这回到左上角+ 1)。这些技巧通常只对内存限制有用。

方式太多信息。告诉我们您的问题的更多信息。

答案 3 :(得分:1)

ImageView arrow = findViewById(/* id of your arrow */);
int width = arrow.getWidth();
int height = arrow.getHeight();
newAngle = /* init it by needed angle */;
RotateAnimation animation = new RotateAnimation(oldAngle, newAngle, width / 2, height);
oldAngle = newAngle;
animation.setDuration(200); // you may  set another duration
animation.setFillAfter(true);
arrow.startAnimation(animation);
祝你好运!

答案 4 :(得分:0)

我看到this示例,我适应了或多或少的工作,请参阅示例以更好地理解我的代码:)


import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.SeekBar;

public class TesteRotateActivity extends Activity implements
    SeekBar.OnSeekBarChangeListener {

private ImageView myImageView;
private SeekBar seekbarRotate;
private float curScale = 1F;
private float curRotate = 0F;
private Bitmap bitmap;
private int bmpHeight;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    myImageView = (ImageView) findViewById(R.id.imageview);
    seekbarRotate = (SeekBar) findViewById(R.id.rotate);
    bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.teste);//here you insert your image
    bmpHeight = bitmap.getHeight();
    drawMatrix();
    seekbarRotate.setOnSeekBarChangeListener(this);
}

private void drawMatrix() {
    Matrix matrix = new Matrix();
    Matrix matrixb = new Matrix();
    Matrix matrixc = new Matrix();
    matrix.postScale(curScale, curScale);
    matrixb.setRotate(curRotate, 100, bmpHeight);
    matrixc.setTranslate(100, 0);
    matrix.setConcat(matrixb, matrixc);
    Bitmap targetBitmap = Bitmap.createBitmap(200, bmpHeight,
            bitmap.getConfig());
    Canvas canvas = new Canvas(targetBitmap);
    canvas.drawBitmap(bitmap, matrix, new Paint());
    myImageView.setImageBitmap(targetBitmap);
}

@Override
public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
    curRotate = (float) progress;
    drawMatrix();
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}

@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}

}

主要的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="@string/app_name" />

<SeekBar
    android:id="@+id/rotate"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_margin="5px"
    android:max="360"
    android:progress="0" />

<ImageView
    android:id="@+id/imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:scaleType="center" />

</LinearLayout>