旋转 ImageView [重复]

Posted

技术标签:

【中文标题】旋转 ImageView [重复]【英文标题】:Rotate an ImageView [duplicate] 【发布时间】: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 突出显示的三个错误是:

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

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

JY

【问题讨论】:

注意:对于你的标题 1)Android Studio 只是一个 IDE,它与问题无关。 2)Android代码(大部分)是Java,所以你不需要说“Java代码” 我投票重新打开这个问题,因为它不是重复的:它不是关于旋转“正常”视图,因为 OP 想要旋转作为 RemoteViews 一部分的 ImageView,其中(参见我的回答)“View.setRotation()”是不可能的。 OP 主要是因为缺乏经验而接受了“重复”,但未来的读者在寻找涉及应用小部件(主屏幕小部件)的解决方案时,不应将其引导至链接的帖子,而应指向此帖子。 【参考方案1】:
    由于该方法是静态的,您需要为 findviewbyid() 创建视图; 或使 void 非静态 旋转角度必须是 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_
            android:layout_
            android:padding="@dimen/widget_margin"
            android:background="#09C">
    <ImageView
        android:layout_
        android:layout_
        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 只要继续问这样的问题(或不时写一个答案),你会做得很好;)但老实说,不要介意投票。 堆栈溢出 就像在现实生活中一样:有些事情很有趣。时不时地做一个小代表不会受到伤害。但是一个很好的谜题或一个让我发现新事物的问题更好:)

以上是关于旋转 ImageView [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在视图上转换后图像超出范围

ImageView.scaleType属性意义

ImageView 显示本地和网上的图片(转)

用手指调整 ImageView 的高度

如何在 Android 中水平滚动 ImageView?

获取 ImageView 中图像的显示大小