【问题标题】:Rotate an overlay image concentrically同心旋转叠加图像
【发布时间】:2013-11-23 18:57:23
【问题描述】:

我非常接近解决方案,但最后一点让我望而却步。我有两个相同大小的图像,它们已覆盖在布局的一部分中。这些图像将根据屏幕尺寸进行缩放以适应屏幕。如果相关的话,我已经使用了多个可绘制对象。

基本上一张图片是一个中间有一架飞机的圆圈,另一张是一个小风向袋。我希望风向袋位于风来自的相对位置。

我在开始时很好地覆盖了风向袋,我可以旋转它,但它不是同心旋转,当我旋转时,风向袋的比例会略有变化。我可以看到这一点,因为当我将旋转归零时,风向袋图形不在起始位置并且稍大。

所以问题是如何缩放叠加层,使其与 android 在创建初始视图时所做的相同?

我的 XML:

        <LinearLayout
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_weight="0.60"
        android:gravity="center"
        >
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:gravity="left"
            android:textSize="12sp"
            android:text="@string/runwayDirection"
            android:textColor="#ffffff" />

         <EditText
            android:id="@+id/rwyDirection"
            android:layout_width="40dp"
            android:layout_height="wrap_content"
            android:layout_marginLeft="1dp"
            android:layout_marginRight="1dp"
            android:background="@drawable/border"
            android:ems="10"
            android:gravity="center"
            android:inputType="number"
            android:maxLength="3"
            android:text="@string/zero"
            android:textColor="#ffffff"
            android:textCursorDrawable="@null" />

    <FrameLayout 
            android:layout_width="fill_parent"
            android:layout_height="fill_parent">
        <ImageView
                android:id="@+id/aircraftGraphic"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/windRose"
                android:src="@drawable/aircraftgraphic" />
        <ImageView
                android:id="@+id/windpic"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:contentDescription="@string/windRose"
                android:src="@drawable/windsockring"
                />
    </FrameLayout>
    </LinearLayout>

我用来旋转的代码:

public void rotate_windsock(){

float relativeWind=90;
float rwydir;
float windDirection;

if (rwyDirection.getText().toString().matches("")) rwydir=0;
else rwydir=Float.parseFloat(rwyDirection.getText().toString());

if (windAngle.getText().toString().matches("")) windDirection=0;
else windDirection=Float.parseFloat(windAngle.getText().toString());

if (rwydir>windDirection) relativeWind=360-(rwydir-windDirection);
else relativeWind=(windDirection-rwydir);

Matrix matrix=new Matrix();
windSock.setScaleType(ScaleType.MATRIX);   //required
matrix.postRotate((float) relativeWind, aircraftGraphic.getWidth()/2, aircraftGraphic.getWidth()/2);
//matrix.postScale(aircraftGraphic.getWidth(), aircraftGraphic.getWidth());
windSock.setImageMatrix(matrix);

}

你可以看到我目前正在尝试获取底层图片的宽度,因为它是一个正方形,所以使用它作为postRotate 的参数。我尝试获得LinearLayout 的宽度,并尝试在底层图像上进行旋转,希望它可以缩放到与上层图像相同,但没有任何效果。很接近,但显然不对。

有人帮帮我吗?我唯一想到的另一件事是进一步缩小图像,这样它们就不会被缩放,但这会浪费大屏幕上的空间?

编辑:

我已尝试将轮换代码更改为:

Matrix mat = new Matrix();
Bitmap bMap = BitmapFactory.decodeResource(getResources(),R.drawable.windsockring);
mat.postRotate(relativeWind);
Bitmap bMapRotate = Bitmap.createBitmap(bMap, 0, 0,bMap.getWidth(),bMap.getHeight(), mat, true);
windSock.setImageBitmap(bMapRotate);

现在看起来很完美,跑道方向和风向之间的差异是 90 的倍数,但是风向袋的缩放会受到影响?!?!?!那是怎么回事!

编辑#2: 好的对于那些将来的人,我现在可以通过这些链接工作: Rotate image without shrinking on Android http://learnandroideasily.blogspot.com.au/2013/07/imageview-animation-in-android.html

执行此操作的代码:

RotateAnimation rAnimClockWise = new RotateAnimation(0.0f, relativeWind, 1, 0.5f, 1, 0.5f);
rAnimClockWise.setFillAfter(true);
rAnimClockWise.setInterpolator(new LinearInterpolator());       
rAnimClockWise.setDuration(0);
windSock.startAnimation(rAnimClockWise);

我知道这最终会非常长,但我相信它会在未来帮助某人!!

【问题讨论】:

    标签: android image rotation imageview overlay


    【解决方案1】:

    查看我在原始问题中所做的修改以获得答案!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多