Local blog for Japanese speaking developers
モーショナル インテリジェンス: スマートなアニメーションを作成する
2019年10月9日水曜日
この記事はデベロッパー アドボケイト Nick Butcher による Android Developers - Medium の記事 "
Motional Intelligence: Build smarter animations
" を元に翻訳・加筆したものです。詳しくは元記事をご覧ください。
イラスト:
Virginia Poltrack
今年の
Google I/O
では、Android アプリでスマートなアニメーションを記述するいくつかのテクニックについてお話ししました。特に詳しく説明したのが、リアクティブ アーキテクチャが使われている場合にアニメーションをうまく動作させる方法です。
https://medium.com/media/406377eaf27f26e0dc34197743348e8c/href
要約すると
32 分の動画は見たくないという方もいるでしょう。そういう方のために、かいつまんで説明します。
#AnimationsMatter
私は、アプリのユーザビリティにとってアニメーションは重要だと考えています。アニメーションを使うと、状態の変化や遷移について説明したり、空間モデルを確立させたり、注目を集めたりすることができます。また、ユーザーはアプリについて理解しやすくなり、ナビゲーションにも役立ちます。
👈 アニメーションがあるとき、ないとき 👉
この例は、アプリの同じフローを示していますが、左側はアニメーションが有効になっており、右側は無効になっています。アニメーションがないと、何が変化したのか説明がないまま突然状態が変わることになるので、唐突な印象を与えます。
私がアニメーションは重要だと考えるのはそのためですが、一方で、最近のアプリのアーキテクチャの変化によって、アニメーションの実装が難しくなっているとも感じています。一般的には、ほとんどの状態管理機能を
ビューレイヤーの外に出して
コントローラ(ViewModel など)に移し、コントローラが何らかの状態オブジェクト(ビューのレンダリングに必要になるアプリの現在の状態をカプセル化した UiModel など)を発行しています。データモデルで何かが変化すると(ネットワーク リクエストの応答やユーザーが開始したアクションの完了など)、更新された状態全体をカプセル化した新しい UI モデルが発行されます。
ViewModel が状態オブジェクトのストリームを発行する
この記事では、このパターンやそのメリットについては特に取り上げません。これらを説明した優秀なリソースはたくさんあります。一方向データフロー(Uni-directional Data Flow)や MVI について検索するか、
MvRx
や
Mobius
などのライブラリを調べてみてください。ここで注目するのは、このストリームのもう一方の端、すなわちビューがモデルのストリームを監視し、それを UI にバインドする部分です。これは、ある新しい状態が与えられると、それを UI に対して完全にバインドする純粋な関数のように思えます。UI の現在の状態のことは考えたくありません。つまり、データを UI にバインドする操作はステート
レス
であるべきです。しかし、アニメーションはステート
フル
です。アニメーションとは、時間とともにある値から別の値に遷移させる操作だからです。この点が、本投稿で着目したい本質的な矛盾です。現在、この矛盾のために多くのアプリでアニメーションが削除され、実際にユーザビリティの低下につながっています。
……データを UI にバインドする操作はステートレスであるべきです。しかし、アニメーションはステートフルです
。
問題は何か
では、どうすればこのリアクティブな世界でアニメーションを維持できるのでしょうか。また、どのような課題に対処しなければならないのでしょうか。これについて具体的に考えてみましょう。ここでは、最小限の例として、ログイン画面を取り上げます。
ログインボタンと進捗インジケーターが表示、非表示されるときにフェードインまたはフェードアウトするログイン画面
ユーザーがログインを押すと、ログインボタンを隠して進捗インジケーターを表示しますが、その際にログインボタンをフェードアウト、進捗インジケーターをフェードインします。
この画面の状態オブジェクトと(静的)バインディングのロジックは、次のようになります。
https://medium.com/media/bdf210ac964c06cad6f7b8d41f981399/href
この変更を
アニメーション
させたい場合、最初に考えるのは次のようなコードでしょう。ここでは、alpha プロパティをアニメーションさせようとしています(フェードアウトの場合は、最後に visibility の値もセットします)。
https://medium.com/media/8c53030d0893b612b37fc09acfd87fe9/href
しかし、これは予期しない結果になります。
リアクティブ アプリにアニメーションを追加する際に起きがちな問題
ここでは、キーを押すたびに新しい UI モデルが発行されています。しかし、本来表示されるべきではない進捗インジケーターが表示されていることがわかるでしょう。また、送信ボタン(デモ用にアニメーション時間を長くしています)を押すと、ボタンと進捗インジケーターの両方が消えてしまうというおかしな状態になります。この原因は、アニメーションに
エンドリスナー
などの副作用があり、それが正しく処理されない点にあります。
リアクティブの世界でアニメーションを記述する場合、アニメーションのコードはいくつかの特性に従わなければなりません。ここでは、その特性を以下のように分類します。
リエントラント
連続
スムーズ
リエントラント
リエントラント(再入可能)とは、いつでもアニメーションの中断や再呼び出しが可能でなければならないということです。新しい状態オブジェクトがいつ発行されるかわからない場合、実行
中
に新しい状態がバインドされることをすべてのアニメーションで考慮しなければなりません。そのためには、実行中のすべてのアニメーションをキャンセルまたは再ターゲットでき、副作用(リスナーなど)もクリーンアップできる必要があります。
連続
連続とは、アニメーションの対象となる値が突然変化してはいけないことを指します。この特性を説明するために、タッチしたり離したりすると、大きさと色がアニメーションするビューについて考えてみましょう。
タッチすると大きさと色がアニメーションする
アニメーションを最後まで実行すれば何の問題もありませんが、すばやくタップすると大きさや色が突然変化します。これは、バインディングのコードに、「フェードのアニメーションは必ず alpha が 0 の状態から始まる」などの誤った前提が含まれている結果です。
スムーズ
この特性について理解するために、イベントに応答して左上または右上にビューをアニメーションさせる例を考えてみましょう。
スムーズでないアニメーション
すばやく連続して 2 回右上に移動させようとすると、ビューは途中で一度止まってからゆっくりと目的地に向かい続けます。移動中に目的地を変えると、同じように一度止まってから突然方向を変えます。このような突然の停止や方向転換は不自然に見えます。現実の世界では、このように動作するものはないからです。スムーズなアニメーションを実現するには、こういったタイプの動作を避ける必要があります。
修正する
では、先ほどの可視性をバインドする関数に戻り、問題を修正してみましょう。まずは、
連続性
について見てみます。先ほどの alpha アニメーションは、常に初期値から最終値、たとえばフェードインの場合は 0 から 1 に変化するものでした。代わりに、初期値を省略して最終値のみを与えるようにします。
https://medium.com/media/62955ba5474dc2cced86c1d67f872b55/href
初期値を省略した場合、アニメーターは
現在の値を読み取って
そこから開始します。これこそがまさに実現したいことです。これにより、アニメーションするプロパティの値が突然変わる事態を防ぐことができます。
次に、関数を
リエントラント
にしていつでも呼び出せるようにします。まず、少しばかり怠けて、不要な作業は行わないようにします。ビューが既に目標値になっている場合は、すぐに処理を終了します。
https://medium.com/media/c09f4cea72a395f3e4d72ed271ecb53f/href
続いて、新しいアニメーションを始める前にキャンセルできるように、実行中にアニメーターとリスナーを保存する必要があります。論理的に考えれば、これを保存すべき場所はビュー自身ですが、View にはこれを行う便利な仕組みが既に備わっています。それが
ViewPropertyAnimator
です。これは View.animate() を呼び出した際に返されるオブジェクトで、新しいアニメーションを開始した際に、あるプロパティに対して現在実行されているアニメーションがあれば、それを
自動的に
キャンセルしてくれるという優れものです。
ViewPropertyAnimator は
withEndAction
メソッドも提供しています。これは、アニメーションが正常に完了した場合のみ実行され、キャンセルされた場合には実行
されません
。これも私たちが望む動作そのものです。つまり、新しい目標値が入ってきてアニメーションがキャンセルされた場合でも、副作用(先ほどの可視性の変化など)は起こりません。ViewPropertyAnimator に切り替えることで、関数はリエントラントになります。
https://medium.com/media/f251842f0040483180dd01d0fcdb6bfa/href
ViewPropertyAnimator は、同じプロパティに対して実行中のアニメーションがある場合、そのアニメーションをキャンセルしてから新しいアニメーションを開始すると説明しました。これは
スムーズ
の特性と相反します。そのため、先ほど見たように、アニメーションが突然止まって別のアニメーション(同じ時間で距離が短いアニメーション)が始まることになり、アニメーションがスムーズでなくなる可能性があります。これに対処するため、ほとんどのデベロッパーにとっておなじみではないと思われるアニメーション ライブラリに着目します。
spring による補間
spring は、
「dynamic-animation」Jetpack ライブラリ
の一部です。このライブラリの派手なサンプル アニメーションを見て、これは不要だと思った方は多いかもしれません。派手な効果は役立つこともありますが、常に必要または望まれるとは限りません。しかし、このような派手な動きは
無効にする
こともでき、その場合でも物理モデルに基づいたアニメーション システムは
使うことができます
。このアニメーション システムには、汎用的なアニメーションに役立つたくさんの特性が備わっています。特に便利なのは、中断と再ターゲットです。
先ほどの例に戻りましょう。これを spring アニメーションを使って実装し直すと、スムーズさの問題が起こらなくなります。現在の速度を踏まえつつ、目的地を変えてアニメーションを開始し直してくれるので、スムーズなアニメーションを実現できます。
spring ベースのアニメーションでは、再ターゲットしても速度が維持される
SpringAnimation
の記述は、通常の Animator の記述とよく似ています。メリットの大半は、start() を呼び出す代わりに
animateToFinalPosition
メソッドを使用することで得られます。このメソッドは、まだ開始されていない場合はアニメーションを開始しますが、重要なのは、実行中のアニメーションがある場合、突然値を変えるのではなく、勢いを維持したまま新しい目的地に
再ターゲット
してくれることです。
残念ながら、spring は View.animate のような便利な View API から使うことはできません(Jetpack のみの機能です)。しかし、次のような拡張関数を作成することはできます。
https://medium.com/media/789d0df811af983807a9ae2e7fe720dc/href
この拡張関数は、指定された
ViewProperty
(
平行移動、回転など
)に対する spring を作成または取得し、ビューのタグに保存します。これを使えば、animateToFinalPosition メソッドを使って簡単に実行中のアニメーションを更新できます。可視性をバインドする関数でこれを使うと、次のようになります。
https://medium.com/media/d628037fce924a2c15e0b0bf366cfcec/href
さらに、終了アクションを切り替えて、spring アニメーションのエンドリスナーを使う必要があります。完全なコードは
こちらの gist
から参照できます。アニメーションをある程度カスタマイズしたい場合もあるでしょう。通常のアニメーションでは時間や補間方法を指定しますが、spring はそれとは異なり、弾性(stiffness)や減衰率(damping ratio)を設定することでカスタマイズします。適切なデフォルト値を指定しつつ、関数の呼び出し元から簡単にカスタマイズできるように、拡張関数を変更してこれらのパラメータを受け取れるようにすることもできます。完全な実装は
こちら
をご覧ください。
以上で、可視性のバインドはリエントラント、連続、スムーズという特性を備えるようになりました。これを実現するのは大変だと思うかもしれませんが、実際に必要になるのはいくつかのバインド関数だけです。この関数は、アプリ全体で使い回すことができます。この spring テクニックを簡単に使用できるようにパッケージ化した
ライブラリはこちら
です。
アイテム アニメーター
このタイプのアニメーションを使った別の例を見てみましょう。先ほどの原理を
RecyclerView.ItemAnimator
に適用したものです。
👈 DefaultItemAnimator と spring ベースの ItemAnimator 👉
この例は、シャッフル ボタンを押してアニメーションを実行している間にデータセットがアップデートされる状況をシミュレートしています。すばやく 2 回ボタンを押した場合、spring ベースのアニメーターのスムーズさはまったく違うことに注目してください。左側では、ボックスが止まってから方向が変わります。右側では、スムーズに方向が変わります。ほとんどのアプリは、ネットワークの複数の場所から情報を読み込んで RecyclerView に表示しているはずです。アニメーションにこのような柔軟性を持たせることで、アプリの洗練度が上がり、はるかにスムーズな体験を実現できるようになります。このタイプのアニメーターを
Plaid サンプル
に追加した際の
PR はこちら
です。
スマートなアニメーション
皆さんがリアクティブなアプリにアニメーションを記述する際に、この投稿で説明した原理が役立ち、ユーザビリティの改善につながることを期待しています。実は、この原理は次のような順位のリストで表現できます。
@crafty によるアニメーションのニーズ階層
リエントラントであるということは、正確であるということです。この特性がないと、アニメーションが壊れる可能性があります。ViewPropertyAnimator を使うか、中断されたり再呼び出しされたりする可能性があることに注意してアニメーションのコードを書くようにします。
連続性とは唐突な変化を避けることで、ユーザー エクスペリエンスの向上につながります。これは、アニメーションのコードから誤った前提を削除し、アニメーション間の引き継ぎを簡単にすることで実現できます。
スムーズさは、ケーキ 🎂 のアイシングのようなものです。アニメーションを自然に見せ、動的な変化や中断、再ターゲットに対応できるようにします。
アニメーションを使うと、アプリは楽しくなるだけでなく、わかりやすくもなります。私はそう確信しています。ぜひこのテクニックを習得し、うまくアプリに組み込めるようにしておきましょう。
Reviewed by
Yuichi Araki - Developer Relations Team
ラベル
.app
1
.dev
1
#11WeeksOfAndroid
13
#11WeeksOfAndroid Android TV
1
#Android11
3
#DevFest16
1
#DevFest17
1
#DevFest18
1
#DevFest19
1
#DevFest20
1
#DevFest21
1
#DevFest22
1
#DevFest23
1
#hack4jp
3
11 weeks of Android
2
A MESSAGE FROM OUR CEO
1
A/B Testing
1
A4A
4
Accelerator
6
Accessibility
1
accuracy
1
Actions on Google
16
Activation Atlas
1
address validation API
1
Addy Osmani
1
ADK
2
AdMob
32
Ads
73
Ads API
134
ads query language
2
ads scripts
2
ads search
1
advanced markers
1
Advanced Protection Program
3
AdWords API
25
adwords scripts
2
aerial view api
1
Agency
1
AI
19
AIY
3
AIY Vision Kit
2
ALPN
1
AMP
120
AMP Cache
9
AMP Camp
2
AMP CSS
1
AMP Extension
1
AMP Fest
1
AMP for Email
4
AMP Optimizer
1
AMP Packager
1
AMP Playground
1
AMP Plugin
1
AMP SSR
1
AMP Story
4
AMP Toolbox
1
amp-bind
1
amp.dev
1
AMPHTML Ads
1
Analytics
9
Andorid
12
Android
400
Android 10
1
Android 11
20
Android 11 Compatibility
1
Android 11 final release
1
Android 11 meetups
1
Android 9
1
android api
1
Android App Bundle
1
Android App Development
23
Android Architecture
1
Android Architecture Components
1
Android Auto
1
Android Design Support Library
1
Android Developer
14
Android Developer Story
4
Android Developers
13
Android Enterprise
6
Android for cars
2
Android Go
1
Android Jetpack
6
Android N
18
Android O
14
Android Open Source Project
1
Android P
7
Android Pay
1
android privacy
1
Android Q
13
Android Ready SE Alliance
1
android security
5
Android Security Year in Review
1
Android StrongBox
1
Android Studio
47
Android Studio 4.1
1
android study jam
1
Android Support Library
6
Android Things
15
Android Tools
2
Android TV
11
Android Vitals
4
Android Wear
29
android11
6
androidmarket
3
androidstudio
1
AndroidX
6
Angular
2
Angular 2
2
AngularJS
2
Announcements
2
Anthos
2
antmicro
1
AoG
1
aosp
1
API
28
APIExpert
45
apk
2
APM
1
app
3
App Action
1
App Bundle
2
app check
1
app engine
24
App Indexing
7
App Invites
6
App Maker
2
App modernization
1
AppCompat
2
Apps Flutter eBay
1
Apps Script
12
AppSheet
1
aprilfool
4
AR
3
Architecture Components
7
ARCore
3
ArtTech
1
asset-based extensions
2
assets
1
Associate Android Developer Certificate
1
Attribution Reporting
1
Audio
7
Auth Code
1
Authentication
9
AuthSub
2
Autofill
5
AutoML
1
Autotrack
2
award
1
Awareness API
1
basemap
1
basic-card
1
Beacons
6
bento
2
BERT
1
Best Practices
1
beta
4
Better Ads Standards
3
BigQuery
10
Billing
1
Biometrics
1
BLE
4
Blink
1
Blockly
1
blogger
1
BodyPix
1
bootcamp
1
Brillo
1
Brotli
2
Budou
1
budoux
1
Buildbetterapps
2
C++
1
Calendar
3
call ads
1
campaign
2
campaignsharedset
1
Campus
1
Canvas
1
Cardboard
4
Career
1
Case Study
3
CCPA
1
CDS 2020
3
CDS Recap 2020
3
Certificate
8
changestatus
1
chrome
261
chrome 98
1
Chrome Apps
1
Chrome Custom Tab
4
Chrome Dev Summit
5
chrome extension
14
Chrome for Android
2
Chrome for iOS
3
Chrome OS
10
Chrome Root Program
1
Chrome Root Store
1
Chrome Tech Talk Night
4
chrome103
1
chrome104
1
chrome108
1
chrome90
1
Chromebook
5
Chromecast
7
chromewebstore
9
Chromium
20
CLI
1
ClientLogin
3
Closure Compiler
1
Cloud
28
Cloud AI Platform
2
Cloud Firestore
5
Cloud Functions
9
Cloud IoT Device SDK
1
cloud messaging
1
Cloud ML Summit
1
Cloud Next
19
Cloud OnAir
5
Cloud OnBoard
4
Cloud PubSub
1
Cloud Run
1
Cloud Storage
1
Cloud Study Jams
3
Cloud Summit
1
Cloud Test Lab
2
Cloudflare
1
CNN
1
Coalition for Better Ads
2
CocoaPods
1
code review
1
codejam
5
codelab
5
Codepen
1
Colaboratory
1
Common Criteria
1
Community
6
compatibility
1
Compose
1
compose camp
1
compute engine
3
consent
1
Contests
1
Context
1
controls
1
Conversation API
1
conversations
2
conversion
1
Cookie
10
Coral
3
core web vitals
1
COVID-19
2
Crash Reporting
2
Crashlytics
3
cryptography
1
Custom Element
1
Custom Model
1
CWV
2
dark theme
1
Dart
2
data retention
1
DataCenter
1
datacloudsummit
1
Daydream
4
deck.gl
2
Deep Learning
4
Delegation
1
Demo Party
1
Design Patterns
1
Design Sprint
3
DesignBytes
1
Designer
1
DevArt
3
DevBytes
6
Developer
15
Developer Console
4
Developer Library
1
Developer Preview
6
Developer Relations
3
Developer Review
1
Developer Student Club
1
DEVELOPERS
1
Developers Story
4
DevFest
12
DevFestX
3
DevOps
1
devtools
4
Dialogflow
1
Differential privacy
2
Digital Asset Links
1
Digital Goods API
1
directions api
1
DirectShare
1
Discover
1
distance matrix api
1
DNS-over-HTTPS
4
Domain
1
Doodle
1
DoubleClick
4
Doze モード
1
drive
2
DSA
1
DSC
1
DX
1
Dynamic Links
3
EarlGrey
1
Easter Egg
1
ECMAScript 2015
1
Eddystone
4
Edge
1
egypt
1
encoder
1
Encryption
1
English
2
environment api
1
Envoy
1
error
1
ES2015
1
ES2016
1
ES6
2
ES7
1
eta
1
Event
7
events
3
extensions
1
external
1
Featured
25
Feed
2
feed-based extensions
3
feeds
1
FIDO
7
filter
1
final release
1
Firebase
123
Firebase Admin SDK
6
Firebase Analytics
10
Firebase Auth
4
Firebase Cloud Messaging
10
Firebase Crashlytics
2
Firebase Database
5
firebase for games
1
Firebase Libraries
1
Firebase Notifications
1
Firebase Performance
3
Firebase Remote Config
6
firebase summit
1
Flash
1
FLEDGE
1
FLoC
2
Flutter
8
Flutter App Development
1
flutter3
1
font
3
fraud
1
G Suite
19
game
43
Game Developers Conference 2018
1
Game Developers Conference 2019
1
Game Development
1
gaming
1
gaql
8
Gboard
2
gc_datacloud
1
GCCN
1
GCP
17
GCPUG
1
GDC
1
GDD11JP
56
GDD2010JP
23
GDE
2
GDG
22
GDG Cloud
1
gdsc
4
Gemini
5
Gemma
1
generative AI
4
Geo
55
Gingerbread
1
GLIDE
5
global foundries
1
Gmail
6
Gmail API
3
Go
1
Go Checksum Database
1
golang
5
goo.gl
1
Google
8
Google account
1
Google Analytics
4
Google API
2
Google Apps
14
Google Apps Script
4
Google Assistant
13
Google Assistant SDK
2
Google Binary Transparency
1
Google Cast
8
Google Chat
3
Google Cloud
49
Google Cloud Day
10
google cloud innovators
2
Google Cloud INSIDE Digital
2
Google Cloud INSIDE Games & Apps
9
Google Cloud INSIDE Media
1
Google Cloud INSIDE Retail
3
Google Cloud Messaging
11
google cloud next
4
google cloud next tokyo
3
Google Cloud Platform
16
Google Code-in
1
Google Dev Library
1
Google Developer Experts
2
google developer groups
1
google developer student clubs
1
Google Developers Academy
1
Google Developers live
5
Google Developers Summit
2
Google Drive
6
Google Earth
1
Google Fit
2
Google for Games
3
Google for Mobile
2
Google for Startups
8
Google for Work
1
Google I/O
26
Google I/O 2024
3
Google Identity Services
6
Google Impact Challenge
1
Google Maps
72
Google Maps Platform
91
Google Meet
1
Google ML Summit
2
Google Open Source Peer Bonus
1
Google Pay
6
Google Photo
1
Google Play
148
Google Play App Safety
1
Google Play Billing
1
Google Play Console
15
Google Play developer distribution agreement
1
Google Play Developer Policies
2
Google Play Game Services
10
Google Play Instant
1
Google Play Services
23
Google Play Store
1
Google Play アプリ署名
1
Google Plus
14
Google Search
8
Google Sheets API
3
Google Sign-In
17
Google Slides API
5
Google Summer of Code
1
Google Tag Manager
1
Google Tensor
1
Google Trust Services
3
Google マップ
4
google_ads_api_v6
1
Google+
2
Googleapps
10
GoogleCloud
5
GoogleCloudDay
5
GoogleCloudInside
1
googlecloudlearn
1
googlecloudnext
2
GoogleGames
1
GoogleI/O
31
GoogleLabs
1
GooglePlay
3
GoogleTV
1
GPS
1
Gradle
1
Growth Academy
1
gRPC
2
GTUG
5
GWT
2
hack4jp
2
hackathon
7
handson
1
Hangouts Chat
3
hardware
2
Hosting
3
hotel
1
How-To Guide
1
HTML5
17
HTML5Rocks
1
HTTP/2
5
HTTPS
19
I/O Extended
7
ID Token
1
Identity
18
Identity Toolkit
1
IGF2010
4
IGF2020
2
Ignite
4
Imagen 2
1
IME
12
Indie Game
7
Indie Games Festival
7
Indie Games Festival 2018
2
Indie Games Festival 2019
12
Indie Games Festival 2020
7
Industry Trends
1
Inevitable ja Night
30
innovators hive
2
Insights
1
Instagram
1
Instant Apps
6
intern
2
Invites
1
IO19
3
iOS
22
IoT
7
IPv6
1
Issue Tracker
2
IWD
1
Japanese
6
Japanese Developer
1
Japanese Input
1
java
1
JavaScript
13
Jetpack
5
Jetpack Compose
6
Journeys
1
K-12
1
Kaggle
1
Key Transparency
1
Knowledge Graph
1
Kotlin
25
Kotlin Android Extensions
1
kotlin api
1
Kotlin Beginners
3
Kotlin Vocabulary
2
Kubernetes
4
l10n
8
latest
18
latest news
1
launch
1
LaunchPad
2
Learn
1
lifull
1
Lighthouse
1
LINE
1
Local AI
1
Location
1
Lollipop
10
Machine Learning
32
MAD Skills
2
MADSkills
2
Maker Faire Tokyo
1
maps compose
1
maps embed api
1
Maps JavaScript API
5
maps on air
1
maps sdk
2
maps transportation
1
Marshmallow
10
Material
1
Material Design
31
MDL
2
MDN
1
MediaPipe
1
Messaging
1
metrics
1
MIDI
2
migration
1
mikan
1
Mixed Contents
4
ML
3
ML Kit
12
mlops
1
Mobile
15
Mobile Bootcamp
4
mobile optimized maps
1
Mobile Sites certification
1
Mobile Vision
4
mod_pagespeed
1
Model Maker
1
monetization
2
monetize
3
Mozc
15
Music
1
NativeDriver
2
NativeScript
1
Navigation
1
NBU
1
ndk
3
Nearby
5
News
1
Next Extended
1
Next Tokyo
4
Nexus
2
Nexus S
1
NFC
1
NIST
1
Node.js
3
notifications
2
Noto CJK
1
Now in Android
13
NPAPI
2
NPN
1
oauth
17
officehour
1
One Tap
2
online security
2
open silicon
2
open source
9
OpenAI
1
opencensus
1
opencloudsummit
1
OpenGL
4
OpenID
3
OpenID Connect
4
OpenSocial
1
opensource
20
OpenTitan
1
Optimization
1
OSV
1
p-max
3
Page Experience
1
passkey
3
Password Manager
4
Payment
8
Payment Handler API
1
Payment Request API
2
PDF
1
PEM
33
people
2
People API
3
Performance
16
Performance budget
1
performance max
1
Performance Monitoring
1
performance report
1
permissions
1
personalization
1
PersonFinder
1
Phishing
2
phone
1
photorealistic 3d tiles
1
Physical Web
3
Pi
1
Pixel
4
Place Picker
1
placements
1
places api
1
places SDK
1
Platform Stability
1
Play Billing
2
Play Billing Library
2
Play Console
2
Player Analytics
4
Playtime 2017
1
Policy
8
policy compliance
2
policy violations
2
polylines
1
Polymer
7
pricing
1
privacy
15
Privacy Sandbox
22
Progressive Web Apps
14
project hosting
1
Promise
2
Promo code
1
Protocol Buffers
1
PRPL
1
publicdata
1
Push API
1
Push Notification
6
PWA
4
Python
3
query builder
8
query validator
1
QUIC
2
quick builder
1
quick start widget
1
QWIKLABS
3
RAIL
1
raspberry pi
1
React
1
React Native
2
reactive programming
1
Realtime Database
9
Recap Live Japan 2019
3
reCaptcha
1
Redux
1
release
7
Remote Config
4
Remote Display API
1
Reporting API
1
Requirements
1
Resonance Audio
1
resource type
1
Rewarded Video Ads
2
RKP
1
rmf
2
routes api
3
RSS
1
Run on OS Login
1
Runtime Permission
1
Rust
2
Safe Browsing
4
safety
1
Sample Code
2
Santa Tracker
1
SBOM
1
schedule
1
schema
2
schema.org
1
Scorecards
1
script
2
SDG
1
sdk
1
search central
1
secur
1
Secure Element
1
security
92
selfie
1
Service Worker
4
SHA-1
1
Sigstore
4
silicon
3
Site Isolation
1
sketchup
1
skywater
1
SLSA
1
smart displays
1
smart home
1
smart shopping campaign
1
SmartLock for Passwords
5
social
4
Social Good
1
Social Media
1
software development
1
solution challenge
2
Solve
1
SPDY
3
speak2tweet
1
speaker
1
Spectre
2
speedometer
1
Spreadsheet
3
ssc
1
ssd
1
SSR
1
stable release
1
startup
7
Storage
3
store sales direct
1
story
2
streetview
3
Study Jams
12
subscriptions
5
sunset
10
Swift
2
SwiftShader
1
Symantec
1
tag
1
tapple
1
Task
4
Team Drive
1
techtalk
13
TensorFlow
43
TensorFlow Federated
1
TensorFlow Lite
8
TensorFlow Object Detection API
1
TensorFlow Probability
2
TensorFlow.js
4
test
4
Test Lab
6
TF Certificate
2
TFX
1
The Fast and the Curious
13
Titan M2
1
Titan Security Key
1
TLS
4
Topics
1
ToS
1
trace
1
Transliteration
1
Transparency
1
Trust
1
Trusted Web Activity
1
Trusty OS
1
TrustZone
1
Twitter
1
UA-CH
1
Udacity
20
Unity
3
update
1
usecase
1
User Agent string
2
UX
5
v10
2
v10.1
1
v11
1
v13
1
v15
1
v3
1
v4
1
v5
1
v6.1
1
v7
2
V8
5
v9
1
valuetrack
1
Verifiable Design
1
vertex ai
1
Vision AI
1
VP9
1
VR
11
Vulkan
2
wafer
1
Watch Face
2
wave
2
Wear OS
3
Weave
1
Web
37
Web Animations
1
Web Components
9
Web Manifest
2
Web Packaging
3
Web Stories
3
Web Story
3
Web Vitals
7
web.dev
1
WebAssembly
6
WebAuthn
1
WebGL
5
Webhook
1
WebM
1
WebMusic
5
WebRTC
1
WebView
1
Windows
1
Women in Gaming
1
Women Techmakers
1
Women Techmakers Scholars Program
1
WomenDeveloperAcademy
1
Wordpress
2
workmanager
1
WTM
8
Xcode
1
YouTube
18
YouTube API
1
youtube select
1
インタビュー
1
コードサンプル
1
サプライ チェーン
1
プライバシー
1
機械学習
3
言論の自由
1
節電
3
定期購入
1
東日本大震災
9
日本語入力
41
ブログ アーカイブ
2024
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2023
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2022
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2021
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2020
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2019
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2018
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2017
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2016
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2015
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
2014
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2013
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2012
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2011
12月
11月
10月
9月
8月
7月
6月
5月
4月
3月
2月
1月
2010
12月
11月
Feed
Follow @googledevjp
"プロダクトに関するご意見は
プロダクトフォーラム
にお願いします"