20210505のAndroidに関する記事は4件です。

【Unity】NCMBのAndroid通知アイコンを設定する(四角に表示される問題)

今回はNCMBを用いたプッシュ通知にアイコンを設定する方法を紹介したいと思います。 前回はすんなり設定できなかったために先送りになっていましたが対応してみました。 同じようなことが原因でお悩みの方の参考になれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ViewPager/ViewPager2のPageTransformer実装カタログ

ViewPagerおよびViewPager2ではPageTransformerで比較的シンプルな実装でページ遷移のアニメーションをカスタマイズすることができます。遷移アニメーションとその実装方法を紹介していきます。 PagerTransformerとは ViewPager.PageTransformerの定義は以下 ViewPager.java public interface PageTransformer { void transformPage(@NonNull View page, float position); } ViewPager2.PageTransformerの定義は以下 ViewPager2.java public interface PageTransformer { void transformPage(@NonNull View page, float position); } 完全に一致! まあ意図して同じにしているのでしょうけど 第一引数のpageはそれぞれのページのルートViewが渡され、positionは現在のページを0として1ページ右が1、1ページ左が-1となる値が渡されます。 この位置情報を元にViewに操作を行うことでアニメーションを実装します。 transformPageは現在のページと左右のページに対して呼び出されますが、setOffscreenPageLimitで保持するページ数を変更することで、さらに広い範囲のページも表示させることもできます。 transformPageにて各ページのViewの位置や大きさなどを操作することになりますが、デフォルト動作に対する差分操作を行うことになりますので、例えばスクロールさせずに位置を固定させたい場合は、page.translationX = -it.width * positionの用にデフォルトのスクロールによる移動分を打ち消すような操作を実装します。 positionの小数部が0の状態はアニメーションが終了している状態ですので、この状態では中央以外のページが表示されたり、中央のページの状態が変化の途中になったりしないように実装します。 設定メソッドにはちょっと違いがあります。 ViewPager.java public void setPageTransformer(boolean reverseDrawingOrder, @Nullable PageTransformer transformer) ViewPager2.java public void setPageTransformer(@Nullable PageTransformer transformer) ViewPagerはreverseDrawingOrderを指定します、これは各ページのレイヤー順序を変更できます。 falseではページ番号の大きい方が上に描画されますが、trueをしているすると逆にページ番号の若い方を上に表示されるようになります。 reverseDrawingOrder=false reverseDrawingOrder=true ViewPager2ではこのパラメータはなく、falseと同様にページ番号が若い方が上に表示されます。レイヤーの順序を変更したい場合はtranslationZで変更します。現在ではminSdkVersionが21未満であることは珍しいと思うので、ViewPagerもViewPager2もtranslationZでレイヤー順を指定するようにするのが良いかと思います。 実装カタログ ズームアウト ViewPagerの説明ページに載っているやつです。ちょっとパラメータの扱いを変更しています。 translationXで隙間を埋める場合 translationXの補正なし 実装は以下になります。移動に応じてページサイズとアルファを変更しています。 binding.viewPager.setPageTransformer { page, position -> page.also { if (abs(position) >= 1f) { it.alpha = 0f return@setPageTransformer } val scale = (1 - abs(position) / 2).coerceAtLeast(MIN_SCALE) it.scaleX = scale it.scaleY = scale it.alpha = (1 - abs(position)).coerceAtLeast(MIN_ALPHA) it.translationX = (1 - scale) * it.width / 2 * if (position > 0) -1 else 1 } } private const val MIN_SCALE = 0.85f private const val MIN_ALPHA = 0.5f 奥行き これもViewPagerの説明ページに載っているやつです。同様にちょっとパラメータの扱いを変更しています。 実装は以下になります。左側のページを下に表示するためtranslationZを操作しています。 binding.viewPager.setPageTransformer { page, position -> page.also { if (abs(position) >= 1f) { it.alpha = 0f return@setPageTransformer } if (position > 0) { it.alpha = 1 - position val scale = 1f - position / 4f it.scaleX = scale it.scaleY = scale it.translationX = -it.width * position it.translationZ = -1f } else { it.alpha = 1f it.scaleX = 1f it.scaleY = 1f it.translationX = 0f it.translationZ = 0f } } } 奥行き+スライド 奥行きを表現しつつスライドもさせます。 実装は以下になります。左側に抜けていくページは拡大になるので、そのままだとアニメーションが終了するところまで移動させても端っこが画面の中に残ってしまうため、拡大分左側へ移動させています。 binding.viewPager.setPageTransformer { page, position -> page.also { if (abs(position) >= 1f) { it.alpha = 0f return@setPageTransformer } val scale = 1f - position / 4f it.scaleX = scale it.scaleY = scale if (position > 0) { it.alpha = 1f - position / 2f it.translationX = -1f * it.width * position / 2f it.translationZ = -1f } else { it.alpha = 1f it.translationX = it.width * position / 8f it.translationZ = 0f } } } 回転 rotaionでページを回転させることもできますね。 実装は以下。スケールが入れ替わるところでtranslationZを変更してレイヤー順を入れ替えています。 binding.viewPager.setPageTransformer { page, position -> page.also { if (abs(position) >= 1f) { it.alpha = 0f return@setPageTransformer } val scale = (1 - abs(position)).coerceAtLeast(MIN_SCALE) it.scaleX = scale it.scaleY = scale it.alpha = 1f it.translationX = (1 - scale) * it.width / 2 * if (position > 0) -1 else 1 it.translationZ = if (scale == MIN_SCALE) -1f else 0f it.rotation = -position * 45 } } private const val MIN_SCALE = 0.5f ページめくり ページをめくるようなエフェクトですね。実際はページの境界線を表示する必要があるので、プラスアルファの実装が必要です。 実装は以下。translationXでページの移動をしないように見せつつ、clipBoundsで本来のViewの位置で表示をClipすることでページを切り取って表示させています。 binding.viewPager.setPageTransformer { page, position -> page.also { if (abs(position) >= 1f) { it.alpha = 0f return@setPageTransformer } it.alpha = 1f it.translationX = -it.width * position if (position < 0) { it.clipBounds = Rect(it.left, it.top, it.left + it.width, it.bottom) it.translationZ = 0f } else { it.clipBounds = null it.translationZ = -1f } } } 以上です。 カタログと言うにはバリエーション少なかったですね。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

C#を使ってAndoridでHello World する

今回はC#を用いて、Android アプリを作成していきます。 (似たようなことが書かれた記事が既にあるため、今更感はありますが…) Androidアプリで Hello Worldするだけならプロジェクトを作ってそのまま実行するだけで済むため、今回はもう少し動きを付けようかと思います。 開発環境 window10 Visual Studio android7端末(android10端末を使用したら実行できなかった…) フレームワークのインストール 一から説明するとなるとVisual Studioのインストールからということになりますが、インストールの手順は以前に書いた記事があるため、今回は省きます。 androidアプリ用プロジェクトを作成するとなると、それ用のフレームワークが必要になるため、Visual Studioインストーラーを起動してダウンロードします。 「ツール」「ツールと機能を取得」を押下して、Visual Studioインストーラーを起動し、「.NETによるモバイル開発」をダウンロード、インストールします。 プロジェクトの作成 フレームワークのインストールが終わったら、プロジェクトを作成します。 今回作成するのは「Androidアプリ(Xamarin)」です。 androidのバージョンに関して、実機を使用する場合は、実機に合わせたバージョンを使用しましょう。(バージョンの縛りがいろいろあったかと思うので、うまくデバッグできない場合はいろいろ試してみると良いかと思います。) プロジェクトを作成したら、その時点でHello Worldができる状態になっています。 ファイル構成に関しては、「/Resource/layout/」下に .xmlファイルがあり、デザインを見ながら編集することができます。 アプリに動きを付けたい場合は「MainActivity.cs」ファイルを編集するか、別の.csファイルを作成してロジックを作成します。 デバッグ時の設定 デバッグの方法に関しては、エミュレータを使用する方法と実機を使用する方法があり、今回は実機を使用します。 エミュレータを使用する場合は、デバッグ時に上部の「Android Emulator」を選ぶと、PC内にandroidのエミュレータを作成することができます。 実機でデバッグする場合には「開発者オプション」と「USBデバッグ」を有効にする必要があります。 調べるとすぐわかるため、細かく書きませんが、設定画面のビルド番号を複数回押下すると開発者オプションが変更可能になり、開発者オプション内のUSBデバッグをONにすると準備が整います。 個人的には、エミュレータを使用しようとすると1GBぐらいダウンロードする必要があり、動きも重い印象があるため、実機でデバッグする方が楽かと思います。 動作の設定 今回はコーディングでボタン押下時のイベントを追加しようかと思います。 既存の状態ではボタンがないため、「content_main.xml」のデザイン画面を開き、下記の様にRelativeLayout内にボタンを作成します。 content_main.xml <?xml version="1.0" encoding="utf-8"?> <RelativeLayout> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </RelativeLayout> 作成したボタンに動きを付けたいため、「MainActivity.cs」に書き込みを行います。 OnCreate()がアプリ起動時に走るため、その中にボタンのClickイベントを設定します。 表示画面上のボタンオブジェクトを取得するにはFindViewById()でボタンのidを指定してオブジェクトを取得し、.Clickイベントを設定します。 コードは下記の通りです。 MainActivity.cs public class MainActivity : AppCompatActivity { /// <summary>起動時のイベント </summary> protected override void OnCreate(Bundle savedInstanceState) { //ボタンを取得し、イベントを設定する(ボタンのidとして設定されているbutton1を指定) Button button1 = FindViewById<Button>(Resource.Id.button1); button1.Click += Button1_Click; button1.Text = "ボタン"; } /// <summary>"ボタン"クリック時</summary> private void Button1_Click(object sender, EventArgs e) { //通知出力 Toast.MakeText(Application.Context, "click " + DateTime.Now.ToString(), ToastLength.Long).Show(); } } 実行 デバッグを実行すると、USBで接続しているandroid端末で今回作成したアプリが立ち上がり、動作を確認できます。実行結果は下記の画像の様になります。 下記はボタン押下時です。 因みに、スマートフォン上のアプリのロゴは下記の様な表示になります。 おわりに 今回は自身で初めてスマートフォンアプリを作成しました。 androidアプリの作成ということならandroid studioでjavaを使えば良いという話になるのですが、筆者が所属している会社では、支給されているデバイスはiosで、社内でもandroidは使用されていないため、今回学習した内容を生かすということを考えるとjavaだと都合が悪いと思い、iosアプリもandroidアプリも作成できるC#について学び、記事にしました。 (筆者自身はandroid端末を四台も持っていますが、ios端末は会社支給の一台しか持っていません(笑)) Visual Studioを使用すればiosアプリも作成できるはずなので、いずれiosでも試そうかと思います。 また、せっかくスマートフォンアプリの作成方法について学んだので、今度はもっと複雑なロジックを作ってみようかと思います。 あと、android10 の端末でデバッグ実行しようとしたら、エラーが出て実行できなかったので、いずれこの問題は解決しようかと思います。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

GW中にAndroidでRustを動かして遊んだ話

お久しぶりです。先月末に育休から復帰しました。 そして数日前からRustを学んでいて、元々の専門分野がAndroid/iOSなので、Android NDKでRustを動かそう!と思い立ちました。 GitHub repository やったこと Rust for Androidで必要なものを入れる(Readme#how-to-setup-this-project) Android Studioで新規プロジェクト作成、Native C++を選択(diff) C++のJNIをRustに置き換え(diff) Hello Worldをちょっとしたものに作り替え(diff) できたもの Rust勉強目的で作ったgeneratorモジュールで、人のプロフィールっぽい情報を生成し、それをKotlin側で表示するアプリです。 2021/5/6更新 趣味を5つ持たせる機能を追加しました(diff) 起動する度に様々な人のプロフィールが作られます。小説のキャラクター作りに使えるかもしれません。 仕様は以下です。 * 日本人名であり得ない頭文字は出ない。'X'とか * だいたい18歳〜54歳の人とマッチングする(生後6667日〜19999日の範囲) * 趣味は60の配列から重複しない5つが選ばれる なお当初は円周率1億桁の計算をKotlinとRustで性能比較するアプリの予定でしたが、それなりに数学の知識を求められたのと、最初から1機能ガッツリ作るよりまず日付型を扱うとかありがちな処理から始めて基礎を固めたかったので、こういう形に方針転換しました。 開発環境について 懸念されたAndroid Studio上でのRustコーディングですが、コンパイルエラーの原因究明時は特に困りませんでした。 しかし、rsファイルの強調表示や補完を使えず、Rustのプラグインも本日時点では見つからなかったので、Rustプラグインを入れたVSCodeで書くほうが便利でした。 苦労したこと 文字列型の種類で、場所によってString、jstring、CString、&strをそれぞれ要求されて、C++の案件で受けた洗礼を思い出しました。 ここはStringの配列をKotlinに渡そうと苦労した部分です。new_object_arrayとset_object_array_elementでできることを知り、四苦八苦の末に一応動いたが、書き方として適切なんだろうか。 また、長らくKotlin/Swiftやってた身としてはクレートやスライスなど慣れない概念もあり、まだまだ勉強不足を感じました。今回作ったアプリを弄ったりしながら覚えていこうと思います? 参考にしたサイト Android NDK で Rust は使えるのか?調査してみた Rustで日付、時刻を計算する Generate random numbers within a range - Rust Cookbook
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む