定义android wear layouts

*以下内容翻译自android wear的官方教程,本人水平有限,如有错误欢迎指出
home
以下正文


手表使用了与手机相同的布局技术,但有一些需要考虑的约束。在手机上设计UI和功能的经验在手表上并不会都取得成功。如果你想知道怎么设计优秀的手表应用,你可以阅读android 手表设计参考.
当你在创建一个android wear应用的时候,你必须考虑手表的形状。比如方形手表上设计的app在圆形手表上四角的内容都会被剪切。 一个在油管上的示范

以下是一个悲惨案例:

案例
<LinearLayout mlns:android="http://schemas.android.com/apk/res/android"  
  xmlns:tools="http://schemas.android.com/tools"    
  android:layout_width="match_parent"    
  android:layout_height="match_parent"    
  android:orientation="vertical">   
   <TextView       
      android:id="@+id/text"        
      android:layout_width="wrap_content"        
      android:layout_height="wrap_content"        
      android:text="@string/hello_square" />
</LinearLayout>

这个文本被悲剧的阉割了。

Wearable UI Library提供了两个方法来解决这个问题:

  • 定义两个不同的layout来分别定义圆形和方形的界面,你的app会在运行的时候自动检测设备的形状并选择合适的layout来显示信息
  • 使用一个特殊的layout,这个layout会根据设备的形状产生不同的显示效果

如果你想你的app在不同形状的设备上显示不一样的效果,你可以选择方法1。如果你用第二种方法,你将会在两个设备上得到一个相似的界面。

添加Wearable UI Library

Android Studio 默认在你的wear module当中包含了Wearable UI Library 。为了在你的project当中包含这个library,请确保 Extras > Google Repository 这个包已经安装到了你的android SDK当中,同时要保证你的wear module的build.gradle包含了以下依赖(dependency)

dependencies {    
  compile fileTree(dir: 'libs', include: ['*.jar'])   
  compile 'com.google.android.support:wearable:+'
  compile 'com.google.android.gms:play-services-wearable:+'
}```
在接下的layout技术实现中,’com.google.android.support:wearable‘这个玩意是必要的。
如果你想更了解她,这里有她的[API文档](http://developer.android.youdaxue.com/reference/android/support/wearable/view/package-summary.html)
#为不同的形状指定不同的layout
在Wearable UI Library中的[WatchViewStub](http://developer.android.youdaxue.com/reference/android/support/wearable/view/WatchViewStub.html)这个类可以帮你不同形状设备上指定不同的layout在。这个类会在运行时检测设备的形状然后加载(inflates)正确的layout。
使用方法:
1. 你的activity的layout用WatchViewStub作为根节点
2. 定义一个方形的layout,然后在rectLayout属性上指定它
3. 定义一个圆形的layout,然后在roundLayout属性上指定它

*示例*
```xml
<android.support.wearable.view.WatchViewStub   
      xmlns:android="http://schemas.android.com/apk/res/android"  
      xmlns:app="http://schemas.android.com/apk/res-auto"    
      xmlns:tools="http://schemas.android.com/tools"    
      android:id="@+id/watch_view_stub"    
      android:layout_width="match_parent"    
      android:layout_height="match_parent"    
     app:rectLayout="@layout/rect_activity_wear"
     app:roundLayout="@layout/round_activity_wear">
</android.support.wearable.view.WatchViewStub>

在你的activity当中加载(inflate)这个layout

@Overrideprotected void onCreate(Bundle savedInstanceState) {    
      super.onCreate(savedInstanceState);    
      setContentView(R.layout.activity_wear);
}

当然,除了上述步骤之外,你还必须创建res/layout/rect_activity_wear.xml
和 res/layout/round_activity_wear.xml 两个layout。创建这两个layout所使用的语法和技术与在android 手机上开发是完全一样的,但是你必须考录手表的屏幕的大小和形状。如果你完成了上述的步骤,那么系统就会自动的在正确的设备上加载正确的layout.

访问layout上的控件(views)

在WatchViewStub检测设备的形状之前,你的layout尚未被指定,所以你不能马上访问控件。为了访问你的控件,你需要在你的activity当中设置一个监听器来监听WatchViewStub,这样当WatchViewStub检测完后,它会知会你一声。

@Overrideprotected void onCreate(Bundle savedInstanceState) {   
      super.onCreate(savedInstanceState);    
      setContentView(R.layout.activity_wear);   
      WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);    
      stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {  
          @Override public void onLayoutInflated(WatchViewStub stub) {   
             // Now you can access your views           
             TextView tv = (TextView) stub.findViewById(R.id.text);    
              ...       
           }    
      });
}

使用自适应layout

在Wearable UI Library 中的BoxInsetLayout这个类可以帮助你定义同时在圆形和方形屏幕上都很赞的layout。BoxInsetLayout继承于 FrameLayout,她可以依照不同的屏幕形状使你的控件布局在合适的位置。
下面这张图片中的灰色区域显示了BoxInsetLayout会怎么自动的将你的控件布局于圆形的屏幕,控件在这个灰色区域显示需要设置layout_box属性。

  • top,bottom,left,right四个属性值的组合,比如"left|top"来让控件坐落于灰色区域的左上角
  • 所有的位置都是在灰色区域内的。

在方形的屏幕上,窗口的边框是不存在的(没有圆形屏幕上所显示的黑色边角料),layout_box属性也是被忽略的。


**Figure 2.** Window insets on a round screen.
同一种layout在不同屏幕上的显示效果

下面是上面布局效果的layout

<android.support.wearable.view.BoxInsetLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"    
    android:background="@drawable/robot_background"   
    android:layout_height="match_parent"    
    android:layout_width="match_parent"   
    android:padding="15dp">    
    <FrameLayout        
        android:layout_width="match_parent"     
        android:layout_height="match_parent"        
        android:padding="5dp"        
        app:layout_box="all">        
        <TextView            
            android:gravity="center" 
            android:layout_height="wrap_content"   
            android:layout_width="match_parent" 
            android:text="@string/sometext"    
            android:textColor="@color/black" />     
         <ImageButton          
            android:background="@null"        
            android:layout_gravity="bottom|left"      
            android:layout_height="50dp"         
            android:layout_width="50dp"           
            android:src="@drawable/ok" />       
         <ImageButton           
             android:background="@null"       
             android:layout_gravity="bottom|right"    
             android:layout_height="50dp"     
             android:layout_width="50dp"         
             android:src="@drawable/cancel" />  
      </FrameLayout>
</android.support.wearable.view.BoxInsetLayout>

几个注意点:

  • 这个布局文件的根是BoxInsetLayout

  • BoxInsetLayout的padding="15dp" :
    因为圆形屏幕的黑边(window insets)大于15dp,所以这个属性只对方形屏幕有效。

  • FrameLayout的padding="5dp":
    这个padding在方形和圆形的屏幕上都是有效的,所以在方形的屏幕上控件到边缘有20dp(15+5),而在圆形屏幕上是5dp。

  • FrameLayout的layout_box="all" :
    这个属性确保了FrameLayout本身和它的子元素都被显示在圆形的屏幕上,对方形屏幕,这个属性没有用。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容