【问题标题】:Rotate an ImageView [duplicate]旋转 ImageView [重复]
【发布时间】:2016-02-12 07:29:40
【问题描述】:

我正在为 Android 设计(尝试学习)一个简单的小部件。 我有:

public class NewAppWidget extends AppWidgetProvider {

在那个类中,我有简单的代码:

public double angle(Calendar calendarDate) {
        //Earth rotation;
        int day = calendarDate.get(Calendar.DAY_OF_YEAR);
        int angle;
        angle = (day / 365) * 360;
        return angle;
    }

然后我想选择一个图像并在 ImageView 中将其旋转该角度,这完全不起作用...

static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {



 // Construct the RemoteViews object

 ImageView image = (ImageView) findViewById(R.layout.new_app_widget);

    image.setImageResource(R.drawable.moon10);
    image.setRotation(angle);

    // Instruct the widget manager to update the widget
    appWidgetManager.updateAppWidget(appWidgetId, new_app_widget);

}

那里可能有几个错误 - 我是初学者。

Android studio 突出显示的三个错误是:

  1. findViewById 为红色(无法解析方法)
  2. 红色角度(无法解析符号角度)
  3. new_app_widget 在最后一行显示为红色(无法解析符号)

感谢您的帮助,祝您有美好的一天。

JY

【问题讨论】:

  • 注意:对于你的标题 1)Android Studio 只是一个 IDE,它与问题无关。 2)Android代码(大部分)是Java,所以你不需要说“Java代码”
  • 我投票重新打开这个问题,因为它不是重复的:它不是关于旋转“正常”视图,因为 OP 想要旋转作为 RemoteViews 一部分的 ImageView,其中(参见我的回答)“View.setRotation()”是不可能的。 OP 主要是因为缺乏经验而接受了“重复”,但未来的读者在寻找涉及应用小部件(主屏幕小部件)的解决方案时,不应将其引导至链接的帖子,而应指向此帖子。

标签: android imageview


【解决方案1】:
  1. 由于该方法是静态的,您需要为 findviewbyid() 创建视图; 或使 void 非静态
  2. 旋转角度必须是 int,而不是 double

【讨论】:

    【解决方案2】:

    要获得方向,请使用以下函数。只需传递图像路径的上下文和 Uri

    public static int getGalleryOrientation(Context context, Uri path) {
        /* it's on the external media. */
        Cursor cursor = context.getContentResolver().query(path,
                new String[]{MediaStore.Images.ImageColumns.ORIENTATION},
                null, null, null);
    
        if (cursor.getCount() != 1) {
            return -1;
        }
    
        cursor.moveToFirst();
        return cursor.getInt(0);
    
    }
    

    【讨论】:

    • 我看不出这是如何解决问题的...您如何从R.drawable 获取 URI?
    • 感谢@cricket_007 教授如何发送答案。
    • 我所做的只是重新格式化您的答案,我仍然不明白
    【解决方案3】:

    TL;DR

    不可能将View.setRotation(float) 方法与作为主屏幕小部件 一部分的任何View 一起使用,至少这是我的IDE 告诉我的:

    W/AppWidgetHostView﹕updateAppWidget 找不到任何视图,使用错误视图 android.widget.RemoteViews$ActionException: view: android.widget.ImageView can't use method with RemoteViews: setRotation(float)

    话虽如此,让我们至少让您的应用小部件启动并运行 :)

    您需要一个带有ImageView 的布局文件,我们称之为new_app_widget.xml

    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:padding="@dimen/widget_margin"
                android:background="#09C">
        <ImageView
            android:layout_width="24dp"
            android:layout_height="24dp"
            android:background="#ffffff"
            android:id="@+id/imageView"
            android:layout_gravity="center"
           />
    
    </FrameLayout>
    

    像这样更改您的代码:

    static void updateAppWidget(Context context, AppWidgetManager appWidgetManager,
                            int appWidgetId) {
    
        // Construct the RemoteViews object 
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.new_app_widget);
    
        // use the RemoteViews methods to access the children of the FrameLayout:
        views.setImageViewResource(R.id.imageView, R.drawable.moon10);
    
    
        // Instruct the widget manager to update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);
    
    }
    

    如果您需要一些旋转,您必须在 Drawable 上执行它,然后像上面一样使用旋转的 Drawable 调用 setImageViewResource()。 另见Rotating a drawable in Android

    最后,关于:

    红色角度(无法解析符号角度)

    您已经定义了一个方法angle(Calendar)。如果你想使用它,你需要通过一些Calendar 输入来调用它。

    【讨论】:

    • 啊,我以为 ImageView 只是一个常规视图,我的错!
    • 虽然我读到我们应该避免像“谢谢”这样的cmets,但我不得不说!它完全有效,问题解决了,美好的周末即将结束。
    • @Jean-Yves - 感谢您让我知道 :) 您可以通过单击答案左上角的复选标记来表明答案解决了您的问题。当然,您最终也可以对其进行投票。一方面,这会给我带来一些“声誉点”。另一方面,对于在未来寻找解决自己问题的方法的人来说,这对(问题和答案)将更容易找到。如果“重复”状态阻止了这些操作中的任何一个,那么,没关系。这很有趣:D
    • 您好,我的声望太低,无法为您投票……抱歉,我会及时赶到……可能会……
    • @Jean-Yves 只要继续问这样的问题(或不时写一个答案),你会做得很好;)但老实说,不要介意投票。 堆栈溢出 就像在现实生活中一样:有些事情很有趣。时不时地做一个小代表不会受到伤害。但是一个很好的谜题或一个让我发现新事物的问题更好:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多