22

可能是我错过了什么,但是否有任何标志可以知道时钟是圆形的还是方形的?

我可以想象,如果您想设计通知的背景,这很重要。

4

7 回答 7

22

API 23 更新:

要确定屏幕是否为圆形,您可以使用

context.getResources().getConfiguration().isScreenRound()

安卓参考

或者您可以使用roundandnotround资源限定符并让系统应用适当的资源,但请注意这不适用于运行 API 22 或更低版本的设备

来源

感谢指出这一变化的人。

老答案

来自谷歌 I/O 演讲(https://www.youtube.com/watch?v=naf_WbtFAlY#t=284):

从 SDK 20android.view.View类有

public void setOnApplyWindowInsetsListener(OnApplyWindowInsetsListener listener)

并且OnApplyWindowInsetsListener有一个回调方法onApplyWindowsInset

public WindowInsets onApplyWindowInsets(View view, WindowInsets windowInsets){

    if (windowInsets.isRound()){
        //Do stuff
    }

}
于 2014-06-26T21:05:39.663 回答
3

您可能想要使用 WatchViewStub,它包含在可穿戴设备支持库中。在存根中,您指定一个 roundLayout 和 rectLayout,正确的一个将根据用户的屏幕形状自动膨胀。有关如何执行此操作的示例,请参阅 SDK 中包含的 WatchViewStub 示例应用程序。

编辑:可穿戴样本的源代码现已上线。对于这种情况,请查看 WatchViewStub 示例,该示例“演示了如何为圆形和矩形屏幕指定不同的布局”:https ://developer.android.com/samples/WatchViewStub/project.html

快速参考:

在布局中:

    <android.blah.WatchViewStub
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:rectLayout="@layout/rect"
        app:roundLayout="@layout/round" />

其中 rect 和 round 是矩形和圆形显示器的不同布局。

在活动中:

setContentView(R.layout.main);
final WatchViewStub stub = (WatchViewStub) findViewById(R.id.stub);
stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {
    @Override
    public void onLayoutInflated(WatchViewStub stub) {
        mTextView = (TextView) stub.findViewById(R.id.text);
        Log.d(TAG, "TextView: " + mTextView.getText() + " view=" + mTextView);
    }
});

onLayoutInflated 是可选的,但它可以让您查看被膨胀的布局中的内容,因此您可以根据 WatchViewStub 选择膨胀的布局(矩形或圆形)进行额外的自定义。

于 2014-06-27T03:39:35.873 回答
3

从 API 23 开始,您可以使用-roundand-notround资源限定符。因此,无需在几周内使用WatchViewStub.

就像一个小例子一样,采用以下布局:

layout-round/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/round_string"/>

layout-notround/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/square_string"/>

当然,您也可以只使用一个字符串:

layout/example.xml

<?xml version="1.0" encoding="utf-8"?>
<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="center"
    android:text="@string/string"/>

values-round/strings.xml

<resources>
    <string name="string">I am round</string>
</resources>

values-notround/strings.xml

<resources>
    <string name="string">I am square</string>
</resources>

来源

于 2016-02-04T19:14:26.450 回答
1

按照IonSpin 的回答,以下几行可以正常工作:

    if (getResources().getConfiguration().isScreenRound()) {
        //code for round wearables
    } else {
        //code for notround wearables
    }
于 2019-01-08T15:32:36.027 回答
0

windowinsets 方法在我的设备中失败了,所以我做了一个小技巧,丑陋但实用。
如果您需要检查活动内部,请在布局中添加一个隐藏的文本视图,该文本视图具有"1"圆形布局和"0"矩形布局中的值。

<TextView
    android:id="@+id/isRound"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:visibility="gone"
    android:text="1" />

然后在活动中:

TextView isRoundText = (TextView) view.findViewById(R.id.isRound);
boolean isRound = "1".equals(isRoundText.getText());
于 2015-07-29T11:07:36.130 回答
0

我想在这里添加我自己的两分钱,因为我认为我找到了一个解决方案,虽然有点笨拙,但相当简单明了。

为什么 ?首先,@IonSpin 公开的两种解决方案都可以完美运行,但第一种要求 SDK 最低 23,另一种是异步的...

使用-roundand-notround限定符,只需在文件夹内的 Activity XML 布局中添加一个虚拟空视图,layout-round如下所示:

<View
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:id="@+id/isRound"/>

然后在您的 ActivityonCreate()中,简单地执行以下操作:

Log.d(TAG, "is not round ? " + (findViewById(R.id.isRound) == null));

它应该打印在方形智能手表上:

MainActivity:是不是圆的?真的

作为 Android Wear 的新开发人员,我觉得这个解决方案有点令人难以置信,但它确实适用于我的 Sony SmartWatch 3 和虚拟圆形 Android Wear 设备。

这里唯一的缺点/权衡是您必须在所有布局中放置一个虚拟视图......

你们能确认它也适合你吗?

于 2017-01-15T09:18:05.237 回答
-1

如果我理解正确,它将使用标准的 Android 资源,这意味着您只需将布局放入 layout-circle 即可。

于 2014-03-20T07:02:05.587 回答