使用android API = 8在背景图像上旋转透明png图像

时间:2014-01-17 02:15:03

标签: android image android-layout

我有两张照片。背景是这样的 enter image description here,另一个是enter image description here 第二个具有透明背景。两者都是PNG图像。我有一个箭头在背景上的布局,它看起来很完美,就像这个enter image description here

我想旋转箭头指向风吹的方向。我有一个每秒运行一次的循环并更新每个循环的角度。

这是我的布局:

        <FrameLayout
        android:id="@+id/frameMasthead"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/buttonReturn"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_below="@+id/Button01" >

        <ImageView
              android:id="@+id/imageMasthead"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_gravity="center"
              android:src="@raw/masthead"
        />
        <ImageView
              android:id="@+id/imageMastheadFly"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:layout_gravity="center"
              android:src="@raw/masthead_fly"
        />

以下是搜索Google和SO后我尝试过的代码。

imageMastheadFly = (ImageView)findViewById(R.id.imageMastheadFly);
Matrix matrix=new Matrix();
imageMastheadFly.setScaleType(ScaleType.MATRIX);   //required
matrix.postRotate((float) awa, imageMastheadFly.getDrawable().getBounds().width()/2, imageMastheadFly.getDrawable().getBounds().height()/2);
imageMastheadFly.setImageMatrix(matrix);

它编译并运行,但结果不是我想要的。我经常注意到指针正在框架外部和全尺寸,而不是框架的缩小尺寸。以下是我看到的一个例子:

enter image description here你可以看到背景很好,但是恐怖是全尺寸的并且在画面之外。

我发现的一些答案不起作用,因为这是一个API = 8的应用程序,因此它可以在我的所有手机上运行。

如果我放弃了api = 8的要求并将代码更改为:

imageMastheadFly = (ImageView)findViewById(R.id.imageMastheadFly);
imageMastheadFly.setRotation((float) awa);

工作正常。它不适用于我的Nexus-One等旧款手机

我还必须将其添加到XML

android:rotation="0"

答案#1建议我遵循教程,我做了。这是我运行的代码:

imageMastheadFly = (ImageView)findViewById(R.id.imageMastheadFly);
Matrix matrix=new Matrix();
Bitmap bMap;
bMap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
matrix.postRotate((float) awa);
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,
bMap.getWidth(), bMap.getHeight(), matrix, true);
imageMastheadFly.setImageBitmap(bMapRotate);

发生的事情是没有使用箭头的图像,而是我的应用程序的ICON在背景之上。当它旋转时,它不仅旋转,而且它自身缩放,以便即使旋转45度也能适应框架布局。这不是我想要的。我希望箭头旋转而不缩放,所以看起来风只是旋转箭头。本教程中的这段代码看起来不对。看起来像旋转的图像的规格缺失,并且确定它无法正常工作。

我能够让RotateAnimation在API = 8中工作,所以问题就解决了。这是代码。

imageMastheadFly = (ImageView)findViewById(R.id.imageMastheadFly);
RotateAnimation r; // = new RotateAnimation(ROTATE_FROM, ROTATE_TO);
r = new RotateAnimation((float)oldAwa, (float)awa, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
r.setDuration((long) 1000);
r.setRepeatCount(0);
imageMastheadFly.startAnimation(r);
oldAwa = awa;

2 个答案:

答案 0 :(得分:1)

使用ImageView的矩阵来旋转它,你的问题可能是由于设置旋转原点错误引起的 - 可能与使用drawable的边界而不是视图的大小有关。

每次都不要创建位图。

或者,您可以在View上使用RotateAnimation,其中fillEnabled,fillAfter,fillBefore都设置为true。

答案 1 :(得分:0)

我认为你错过了将图像解码为位图。查看教程here。希望它有所帮助。