プロジェクトでは標準のAndroidアプリケーションのコンポーネントを使用します

Androidの強みは、その開放性にあります。 お気に入りのアプリケーション(Google Apps以外の場合)またはコンポーネントのソースコードを調査できるだけでなく、プロジェクトにねじ込んで自分やユーザーを喜ばせることもできます。 さらに、そのデザインと動作は、ユーザーにとって馴染みのあるものです。 この記事では、これを行う方法を示します。 借りたいコンポーネントを選択し、ソースで見つけて、調べて、ライブラリに追加して、アプリケーションに接続します。



画像





コンポーネントを選択



まず、標準的なAndroidアプリケーションの1つで目を引くものを選択します。 私の場合、これは時計アプリケーションの循環タイマーです。 次のようになります。



画像



しかし、これをタイマーとしてではなく、進行状況の指標として使用したいだけです。



ソースを見つける



次のステップは、この特定のコンポーネントのソースコードを、Androidアプリケーションのソースコードから他の多くのものの中から見つけることです。 これらのソースはすべてhttp://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android-apps/にあります。



最新バージョン(この記事の執筆時点では4.2.2_r1)を選択し、「com / android」に移動して適切なアプリケーションを探します。 私の場合、これは卓上時計です。 クラスのリストを一目見ただけで... ...幸運です-CircleTimerViewという名前のクラスがあります。 ただし、クラスの説明の代わりに-「TODO:ここに説明を挿入してください。 (isaackatzによって生成されます)»このクラスはViewを継承します-ライブラリのキークラスになります。



ライブラリを作成する



アプリケーションに追加することにしたコンポーネントが小さい場合、この段落をスキップできます。 たとえば、私の場合のように。 しかし、例として、ライブラリを介してそれを行います。 お気に入りのIDEを起動し、「プロジェクトをライブラリとしてマーク」とマークして、新しいプロジェクトを作成します。



見つかったクラスをライブラリに(または直接プロジェクトに)コピーします。 クラスには多くの重大なエラーがありますか? そして当然! クラスのみをコピーしました。これは、アプリケーションと、標準アプリケーションのソースからライブラリに追加されたすべてのクラスとの間の接点になります。



私たちは、通常の生息地から引き離す前に、クラスが依存していたものを調べます。 私の場合、これらはUtils、Stopwatchesクラス、およびR定数のボックスです。



Utilsクラスをコピーし、既に含まれている他のクラスへの多くの依存関係を確認します。 今、あなたは彼が必要とするすべてのクラスを接続し、それからこれが必要とするすべてのクラスを接続することができます...しかし、ユーティリティクラスから必要なメソッドだけを残すほうが良いです。 getTimeNow()およびcalculateRadiusOffset()を除くすべてをスローし、不要なインポートを削除します-正常です。



Stopwatchesクラスから使用される定数は3つだけです。今後は、それらを使用するメソッドと同様に、これらの定数は必要ないと言います。



Rボックスからインデントと色のデータを取得しますが、ここでクラスをコピーするのは簡単ではありません。リソースに基づいて自動的に生成されます。 リソースを追加する必要があります。 ソースコードの「パッケージ/アプリ」アドレスでそれらを見つけ、準備するアプリケーションを選択し、「res / values」フォルダーに移動して、「colors.xml」および「dens.xml」ファイルをプロジェクトライブラリの同じフォルダーにコピーします。



メインクラスのインポートを修正して、ライブラリの準備ができました。 ほぼ。 追加した2つのファイルを削除して、必要なデータのみを残し、これらのファイルの他のバージョンを異なるデバイスに追加する必要があります。 後者を実装するには、「values- *」という名前のフォルダー内のそのような名前のすべてのファイルをソースで検索し、ライブラリにコピーする必要があります。 したがって、たとえば、タブレットでは、電話よりもインデントが多くなります。



ライブラリをアプリケーションに接続します



今、一番いいのは、実際の作業の結果を確認することです。 このコンポーネントを必要とするアプリケーションのプロジェクトを開き、作成されたライブラリを接続し、マークアップにcom.android.deskclock.CircleTimerView要素をスローします。これはアプリケーションの起動時に表示されます。



画像



まあ、これはほとんど私たちが目指していた白い円です。 それを実行に移すためだけに残っています-サークルをクールにするコードが必要です。



再びソースに登り、貸したコンポーネントを使用するアクティビティまたはフラグメントを探します。 私の場合、これはStopwatchFragmentです。 このフラグメントの短い研究の後、要素の操作の簡単なデモンストレーションのために、3行を書くことで十分であることが明らかになります:



final CircleTimerView circleTimerView1 =

(CircleTimerView) findViewById(R.id.circleTimerView1);








circleTimerView1.setIntervalTime(10000);







circleTimerView1.startIntervalAnimation();







アプリケーションを再度起動し、(少なくとも私には)望ましい結果を確認します。



画像



これですべてが正常になりました。つまり、Android開発チームに感謝するときです。 Apache Licenseバージョン2.0ライセンス契約のテキストをアプリケーションに追加することです。 たとえば、設定のボタンに触れるだけで表示します。



中身は?



はい、すべてが正常に機能していますが、使用したコードはほとんど見ていません。 もちろん、これを行うことはできません-Android開発チームのソースコードとコンポーネントの小さな悪魔が飛び出すことはほとんどありませんが、コードを研究した後、それを改善して自分で使用することを学ぶことができます。



私の例のクラスでは、すべてが単純です。onDraw(キャンバスキャンバス)メソッドでのすべてのレンダリング、再描画を呼び出すpostInvalidate()。 円アニメーションを連続させるには、onDraw(...)でinvalidate()を直接呼び出します。



更新さて、フィールドでコンポーネントをテストしました-onDraw(...)からinvalidate()を呼び出すことに対する懸念が確認されました:再カウントとレンダリングにより、コンポーネントはすぐにこのアクションの繰り返しを開始し、中断することなく継続します。

レンダリングはもちろんスムーズですが、700 MHzのプロセッサを使用しているため、電話はすぐにエネルギーを消費し、通知カーテンの速度さえ低下させます。 そして、これはおそらく、私のGalaxy Nexusが目立って熱くなったのは初めてでしょう。

これを修正するのは非常に簡単です。いつもとは異なり、タイマーを継続的に更新する必要があります。 ここでは、変更が視覚的に認識できるようになるまでにどれだけの時間が経過する必要があるかを考慮する必要があります。 たとえば、高解像度のタブレットでこのコンポーネントで5秒のカウントダウンを実行した後、継続的な更新を行うのが理にかなっています。 または、低解像度の携帯電話の2時間タイマーです。 1秒間に少なくとも10回の再描画を実行できますが、視覚的には目立たないでしょう。



必要に応じて、必要に応じてコンポーネントを書き換えて(たとえば、進行状況インジケーターの下で)、継承して必要なメソッドをオーバーライドできます。



次は?



私たちは幸運でした-例のコンポーネントはAPIレベル7(Android 2.1)にないものを使用していませんでした。そうでなければ、この不快な問題を解決する必要があります。 それについて-次回。



みんなありがとう



誰かがこの記事を最後まで読んで、お気に入りの標準Androidアプリケーションの美しいコンポーネントを思い出してプロジェクトに追加した場合、私の仕事が無駄にならなかったことを嬉しく思います。



All Articles