在 kotlin 中旋转 R.drawable

Rotate R.drawable in kotlin

我需要将风向读数显示为箭头,原始 bmp 是一个旋转为 0°(指向上方)的箭头,我有一个 for 循环,我可以在其中从数据库中检索度数,我可以设置可绘制对象到我的 mpandroidchart,但我需要旋转那个 drawable。

 val jsonTemperatureData = JSONArray(result?.get(0))
 for (i in 0 until jsonTemperatureData.length()) {
     val item = jsonTemperatureData.getJSONObject(i)
     val reading_temperature = item.getString("reading_windspeed")
     val degrees= item.getString("degrees")

     yVals.add(Entry(hour.toFloat(), reading_temperature.toFloat(), ContextCompat.getDrawable(getApplicationContext(),R.drawable.direc)))
 }

如何在这个循环中设置从 val degrees= item.getString("degrees")R.drawable.direc 的浮点值?

如果您使用的是 imageView,则有一个 属性:rotation

如果您有类似下面的代码:

<ImageView
        android:id="@+id/imageView"
        android:layout_width="60dp"
        android:layout_height="60dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>

下面的代码适合我:

imageView.setImageDrawable(ContextCompat.getDrawable(getApplicationContext(),R.drawable.direc))
imageView.rotation = imageView.rotation + degrees.toFloat()

与其旋转可绘制对象,我建议您旋转 ImageView

Matrix matrix = new Matrix();
imageView.setScaleType(ImageView.ScaleType.MATRIX);   //required
val bounds: Any = imageView.getDrawable().getBounds()
matrix.postRotate( YOUR_ANGLE_GOES_HERE, bounds.width()/2, bounds.height()/2);
imageView.setImageMatrix(matrix);

mImageView.setRotation(YOUR_ANGLE_GOES_HERE) 与 API>=11

Source

我找到了解决方案,MPAndroidChart 只接受可绘制对象作为其图表的图标,我想旋转该可绘制对象(如果有 ImageViews 会很容易)。

所以解决方案是将可绘制对象转换为位图,旋转该位图,然后将其转换回可绘制对象并将其设置为图标:

 val jsonTemperatureData = JSONArray(result?.get(0))
            for (i in 0 until jsonTemperatureData.length()) {
                val item = jsonTemperatureData.getJSONObject(i)
                val reading_temperature = item.getString("reading_windspeed")
                val reading_direction = item.getString("reading_winddirection")
                val hour = item.getString("hour")
                if(item.getDouble("maxspeed") > max)
                    max = item.getDouble("maxspeed")
                if(item.getDouble("minspeed")< min)
                    min = item.getDouble("minspeed")

                var icon = BitmapFactory.decodeResource(applicationContext.getResources(),
                        R.drawable.direction0)
                val rotatedBitmap = icon.rotate(reading_direction.toFloat())

                var d: Drawable = BitmapDrawable(getResources(), rotatedBitmap)

                yVals.add(Entry(hour.toFloat(), reading_temperature.toFloat(), d))
            }