Android Wear 开发 (一),如何化身BAT面试收割机
3. 自定义卡片:保留官方提供的卡片流样式,个性化修改卡片内容
4. 完全自定义界面:自己实现界面,需要处理多分辨率问题,自由度高
5. 手表表盘:类似手机动态壁纸的机制
开发平台的搭建
Eclipse平台的搭建
1. 下载最新版本的ADT,详情见官网:http://developer.android.com/sdk/installing/installing-adt.html 。(及早地迁移到Android Studio吧!)
2. 下载必要的SDK版本:最低4.4W.2(API20),也可以是5.0以上。注意不是4.4.2(API 19)。详情见截图。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v31yM3kf-1636293751536)(https://blog.csdn.net/)]
1. SDK Platform:你懂的
2. Samples for SDK:强烈推荐下载,因为部分API在官网的开发者指导文章中是没有提及的,一些解决问题的思路,可以从SDKSamples中学习到。
3. 2个SystemImage:建议下载,要多分辨率测试,还是需要模拟器的!另外,务必升级到最新版本,在开发过程中,遇到模拟器Bug:动态加载的View在手表正常显示,而模拟器失效,更新后即可。
4. Sources for Android SDK:你懂的
3. 升级AndroidSDK Tools:最低23.0.0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OgegBL7C-1636293751568)(https://blog.csdn.net/)]
4. 下载依赖库:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BvJcDJZe-1636293751569)(https://blog.csdn.net/)]
0. Google Support Library : 提供android.support.v4.app.NotificationCompat.WearableExtender:用于实现手表卡片通知的适配
1. Google Play Services:提供com.google.android.gms.wearable:用于实现手机和Wear的数据传输功能
2. Google Repository : 提供android.support.wearable:实现Wear的自定义界面
5. 解压Wear依赖库:下载后的包在/sdk/extras/google/m2repository/com/google/android/support/wearable/1.0.0/wearable-1.0.0.aar。解压到工作目录下,并将里面的classes.jar拷贝到libs目录下。
6. 导入Wear依赖库:Eclipse导入上一步解压的工程,并工程属性properties设置为Is Library.
创建Android Wear工程
ADT升级后,依然没有出现以上画面,因此,选择了以下的方式。
1. 下载模板工程:https://github.com/tangtungai/Android-Wear-Black-Activity-Template
2. Eclipse导入模板工程
3. 模板导入wearable-1.0.0依赖库,解决也许找不到android.support.wearable包的问题。
注:ADT 自(23.0.2)这个版本开始就没有Blank Wear Activity,所以得下载模板工程来开发。
创建模拟器
· Device:选择方形/圆形的设备
· Target:4.4w.2
· CPU/ABI:此处笔者选择Android Wear Intel Atom(X86),因为本人的64位Ubuntu 14.04系统在选择AndroidWear ARM(armeabi-v7a)时候会报错,所以在不确定哪个镜像会报错的情况下,最好两个都下载吧。
· Hardware keyboard present:手表是没有键盘输入的,所以,这里似乎没用,不过语音输入是否与之相关有待调查。
· Skin:选择与Device对应的,AndroidWearSquare
· Use Host GPU:这个很关键,不勾选这个,在做Notification显示自定义的Activity的时候会看到一片漆黑
Android Studio 平台的搭建
在Android Studio中创建新的工程(包名,工程名你随便起了),Next
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1VpaoXu2-1636293751570)(https://blog.csdn.net/)]
同时创建手机项目和Wear项目
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-whdUy3X0-1636293751571)(https://blog.csdn.net/)]
创建Phone端的页面样式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bwHcJJMw-1636293751572)(https://blog.csdn.net/)]
创建Wear端的页面样式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KC6CGN18-1636293751572)(https://blog.csdn.net/)]
同时生成Phone和Wear项目(方便打包)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDysMhLL-1636293751573)(https://blog.csdn.net/)]
Wear的连接调试
步骤是:
1. 手机端usb调试开关
2. 在Android Wear手表设备上开启蓝牙调试开关:
–>原生AndroidWear系统是:连点两次主屏会显示出wear菜单或者长按手表右侧物理按键,滚动到底部点击设置,再滚动动到底部,如果也没有开发者选项,就点击关于,再点击系统版本信息七次,就会出现开发者选项。进入开发者选项,并开启蓝牙调试开关。
–>Ticwear中文系统上是主屏上左划出现菜单,滚动选择设置,滚动到底部,如果也没有开发者选项,同样,就点击关于,再点击系统版本信息七次,就会出现开发者选项。进入开发者选项,并开启蓝牙调试开关。
3. 开启调试会话:
1)手机USB数据线连接到电脑,在手机端打开Android Wear应用(确保应 用已连接到手表)。
2)点击界面右上的齿轮菜单进入设置(Settings)
3)开启“通过蓝牙调试”(Debuggingover Bluetooth)。你可以看到设备连接状态:
Host:disconnected
Target: connected
4)确保手机用USB数据线连接了电脑,并执行adb命令:
adb forward tcp:4444 localabstract:/adb-hub;
adb connect localhost:4444
你就可以看到刚才的连接状态就变成了:
Host: connected
Target: connected
4. 调试应用
如果执行adb devices命令,你的可穿戴设备应该是显示为localhost:4444。要执行任何adb命令,格式应该是类似这样:
adb -s localhost:4444
如果没有其他设备通过TCP/IP连接(即没有连接其他模拟器),你也可以使用简化的命令:
adb -e
例如:
adb -e logcat
adb -e shell
adb -e bugreport
注:其实第3步OK后用AndroidStudio直接跑起Wear程序即可,App即可会自动安装到手表上,稍微有点慢耐心等下就好。
Wear APP的正式开发
与手机端开发的一些不同
系统有个强制休眠时间。如果正在显示界面,但用户又没有进行操作,设备就会休眠。当再次唤醒后,会回到表盘主页而不是你之前的界面。如果你有东西需要持久化显示,可以推送通知到信息流中。
android wear应用相对于手机应用来说,显示尺寸和功能更小巧。可能是手机应用的子集,通常你可以先在手机上操作,然后将结果发送到手表。
用户不需要直接下载应用到android wear设备。你只需要将android wear应用绑定到android手机应用中。当用户安装了手机应用,系统会自动安装android wear应用。可以出于开发目的,你依然可以安装应用到android wear设备中。
4. android wear应用可以访问标准的AndroidAPIs。但不支持一下APIs:
android.webkit
android.print
android.app.backup
android.appwidget
android.hardware.usb
Wear 通知的开发
为了创建一个手持设备上的并且也能同时发送给可穿戴设备的Notification,需要使用NotificationCompat.Builder。当你使用这个类创建Notification之后,如何正确展示的工作就交由系统去完成,无论是在手持式设备上还是可穿戴设备上。
需要导入的类(手机端)
importandroid.support.v4.app.NotificationCompat;
importandroid.support.v4.app.NotificationManagerCompat;
importandroid.support.v4.app.NotificationCompat.WearableExtender;
普通通知栏
手机:普通的通知栏在手机上的效果应该都不陌生,这里就不展开说明
手表:手表端的效果是由2张卡片构成的,第一张是手机通知栏的信息组成,第二张是点击开发手机应用,具体的效果与手机通知栏的点击事件一致,也就是说,如果通知栏没有设置点击事件,那么就不会有第二张卡片。另外,默认的背景色是由应用图标所决定的,是取主要的颜色值
以上是最原始的通知栏效果,没有进行手表端适配处理的。(其实普通的通知栏你都不用做。。。。。。)
添加Wear扩展属性的通知栏
扩展属性
· 多张卡片:通知栏的多张内容展示
· 自定义动作按钮:自定义Action按钮的事件处理
· 设置背景:设置通知栏的背景色
· 堆叠多张卡片:通知栏卡片的堆叠
· 语音回复:
Wear 上的UI开发
Android Wear apps用户界面不同于在手机设备上构建。需要遵循AndroidWear设计规范和UI模式,以确保应用通过针对可穿戴设备而优化的一致用户体验。
UI模式主要通过以下方式实现:
卡片
倒计时和确认
长按消失
2d pickers
选择列表
Wearable UI Library是Android SDk中Google Repository的一部分,提供帮助你实现这些模式的类,并可以创建同时适配运行在圆形和方形屏幕设备上的布局。
定义布局
当创建android wear布局的时候,要考虑设备有两种屏幕,方形和圆形。任何位于屏幕角落的内容都会被圆形屏幕裁剪掉。
Wearable UI Library提供两种方式解决这个问题:
1、为圆形和方形屏幕的设备定义两套布局。在运行时检测设备屏幕并渲染不同的布局。
2、使用Wearable UILibrary中一种特殊的布局来包住你的布局。这个布局会根据设备屏幕来加载不同的布局文件。
典型的办法是第一种,如果布局简单可以直接使用第二种。
为圆形和方形屏幕定义不同的布局
Wearable UI Library中的WatchViewStub这个类可以让你为圆形和方形屏幕定义不同的布局。这个类会在运行时检测屏幕形状并渲染相应的布局。
1、在你的activity布局文件中添加WatchViewStub元素
2、使用rectLayout属性为方形屏幕指定布局文件
3、使用roundLayout属性为圆形屏幕指定布局文件
[java]
view plain
copy
?
<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>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear);
}
访问布局控件
渲染布局文件不是同步的,所以要设置一个回调来监听WatchViewStub渲染完成。
@Override
protected 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);
…
}
});
}
<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>
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear);
}
访问布局控件
渲染布局文件不是同步的,所以要设置一个回调来监听WatchViewStub渲染完成。
@Override
protected 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);
…
}
});
}
创建卡片
卡片风格可以让不同应用呈现给用户一致的风格和交互。Wearable UI库中实现了为可穿戴设备特殊设计的卡片控件。这个库包含了CardFrame类,CardFrame只能包含一个直接子view,你可以添加其他自定义内容插入到卡片中。
你有两种办法来添加卡片:
1、使用或继承CardFragment2、在你的布局中添加CardScrollView
创建CardFragment
CardFragment 提供一个默认卡片布局,包含标题、图标、描述。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6rsieyVi-1636293751574)(https://blog.csdn.net/)]
创建CardFragment的步骤:
1、在你的布局中,分配一个id给CardFragment
2、在你的activity中新建一个CardFragment实例
3、使用fragmentmanager添加CardFragment实例
[html]
view plain
copy
?
<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”>
<FrameLayout
android:id=“@+id/frame_layout”
android:layout_width=“match_parent”
android:layout_height=“match_parent”
app:layout_box=“bottom”>
</FrameLayout>
</android.suppo
《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》浏览器打开:qq.cn.hn/FTe 免费领取
rt.wearable.view.BoxInsetLayout>
<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”>
<FrameLayout
android:id="@+id/frame_layout"
android:layout_width=“match_parent”
android:layout_height=“match_parent”
app:layout_box=“bottom”>
</android.support.wearable.view.BoxInsetLayout>
Activity``代码中:
[java]
view plain
copy
?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear_activity2);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
CardFragment cardFragment = CardFragment.create(getString(R.string.cftitle),
getString(R.string.cfdesc),
R.drawable.p);
fragmentTransaction.add(R.id.frame_layout, cardFragment);
fragmentTransaction.commit();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear_activity2);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear_activity2);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
CardFragment cardFragment = CardFragment.create(getString(R.string.cftitle),
getString(R.string.cfdesc),
R.drawable.p);
fragmentTransaction.add(R.id.frame_layout, cardFragment);
fragmentTransaction.commit();
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wear_activity2);
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
Android Wear 开发 (一),如何化身BAT面试收割机相关推荐
- 如何化身BAT面试收割机?Android校招面试指南
没有稳定的工作,只有稳定的能力. 又到了万物复苏的季节,在程序猿这个行当里,作为 Android 开发出生的,在经历了八年的脱发生涯后,有了越来越多的想法和感触 趋势 随着各类移动跨平台的兴起,在 R ...
- 想学IT的必看!如何化身BAT面试收割机?终局之战
前言 下面的题目都是大家在面试字节跳动或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享. 参考解析:郭霖.鸿洋 内容特点:条理清晰,含图像化表示更加易懂. 内容概要:包括 Hand ...
- 大牛手把手教你!如何化身BAT面试收割机?附答案
一.背景介绍 从实用角度梳理一篇能够帮大家快速扫盲的CMake基础教程,也是对我目前负责项目的一次学习总结.既然选择从项目实用性考虑,下面的讲解内容可能并不一定完整,更多的是符合项目目前使用到的一些特 ...
- 微信小程序开发之——音乐播放器-编写页面结构和样式,如何化身BAT面试收割机
前言 这些题目是网友去美团等一线互联网公司面试被问到的题目.笔者从自身面试经历.各大网络社交技术平台搜集整理而成,熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率. 主要分为以下几部分: (1 ...
- android定位!如何化身BAT面试收割机?附面试题答案
起因 事情是这样的. 4年前毕业那会,呆在公司的短视频项目,做 视频.那会做得比抖音还早,但是由于短视频太烧钱了,项目被公司关掉了.当时需要开发横竖屏直播/异步视频的场景,就研究下了市场上的 app, ...
- 如何化身BAT面试收割机?Android篇
前言 今天来跟大家分享TIM最强保活思路的几种实现方法.这篇文章我将通过ioctl跟binder驱动交互,实现以最快的方式唤醒新的保活服务,最大程度防止保活失败.同时,我也将跟您分享,我是怎么做到在不 ...
- Java开发必须会的技能!如何化身BAT面试收割机
第1大技能:程序设计和开发 数据结构和算法:常用数据结构,排序,检索等 面向对象编程.设计模式,掌握建模语言和建模工具:UML.MVC编程思想 高质量编码能力:重用性,低耦合,可扩展性,高性能,可维护 ...
- 如何化身BAT面试收割机?看看这篇文章吧!
前言 前不久,几个朋友聚会,谈到了现在的后辈,我就说起了那个大三就已经拿到网易offer的小学弟. 这个学弟是00后,专升本进入我们学校的.进来后就非常努力,每次上课都是第一个到教室的,每次都是坐第一 ...
- 干货精讲!如何化身BAT面试收割机?算法太TM重要了
前言 从毕业到现在面试也就那么几家公司,单前几次都比较顺利,在面到第三家时都给到了我offer!前面两次找工作,没考虑到以后需要什么,自己的对未来的规划是什么,只要有份工作,工资符合自己的要求就行!所 ...
最新文章
- 如何用CSS快速布局(一)—— 布局元素详细
- 牛客网刷题(纯java题型 181~210题)
- authentication list default is not defined for PPP
- JSP简单练习-网站计数器
- python算法与数据结构-快速排序算法(36)
- java enum 报错_enum报错问题,求大神帮看下
- 600岁故宫插上科技翅膀 技术与营销的「双刃剑」?
- 【iOS开发】在一个Xcode页面建立多个工程
- 快速撑握C#知识点之类的数据成员
- python游戏设计毕业论文_游戏毕业设计论文
- 下载xxx视频[python]
- 网页打印服务器无法创建对象,打印问题,小编教你怎么解决automation服务器不能创建对象...
- 沈小滨 项目管理中的领导力
- Tkinter:事件绑定
- java实现普通图片转黑白图片
- 互联网金融系列-支付清算体系介绍-下篇
- mysql Prepared Statements
- python语音合成并播放_语音合成篇
- 三、生成heatmap(一)裁背景和组织patch
- Facebook React完全解析
热门文章
- Eps总结(3)——Eps使用点云生成等高线及高程点
- 面试Java程序员必备的JVM知识
- 安防类基础计算机知识,谁能给我一份安防监控基础知识汇总?
- 网易雷火游戏功能测试面试记录
- 优优聚:美团真相全在杨幂的贯口中
- zip 打包_一人一首流行最新歌曲精选MP3打包云盘ZIP下载
- 服务器主板bios信息修改,服务器主板bios设置
- (二)CCD传感器1000帧(可调)采集,fpga主控,sdram存储 68013usb2.0传输到上位机保存显示:fpga逻辑程序
- Android界面特效全汇总
- ZooKeeper应用场景-分布式锁实现范例