2011年2月23日水曜日

Android 3.0 Platform - 2 -

長いので分割します。
ここには、以下が含まれます。

 ・App widgets
 ・Status bar notifications
 ・Content loaders
 ・Bluetooth A2DP and headset APIs
 ・Animation framework
 ・Extended UI framework

Android 3.0 Platform - 1 -
Android 3.0 Platform - 2 -
Android 3.0 Platform - 3 -

---------------------------

App widgets

Android 3.0 はユーザーのホームスクリーン上でよりインタラクティブな app widget を実現するための、いつくかの新しい widget クラスをサポートします。これには GridView, ListView, StackView, ViewFlipper, AdapterViewFlipper などが含まれます。

より重要なのは、新しい RemoteViewService を使って content provider などから得られるリモードデータのコレクションを GridView, ListView ,StackView などの widget で実現できることです。

AppWidgetProviderInfo クラス (XML 内で <appwidget-provider> エレメントとして定義される) は 2 つの新しいフィールド: autoAdvanceViewIdpreviewImage をサポートします。autoAdvanceViewid フィールドでは、本来 app widget のホストによって auto-advanced される app widget subview の View ID を個別に指定することができます。previewImage フィールドは app widget がどのように見えるかのプレビューを指定し、このプレビューはユーザーが widget picker から選択するときに表示されます。このフィールドがサポートされていない場合、プレビューには app widget のアイコンが使われます。

プレビュー画像の作成を助けるために、Android のエミュレータには "Widget Preview" と呼ばれるアプリケーションが含まれています。プレビュー画像を作成するには、アプリケーションを起動し、あなたのアプリケーションの app widget を選択し、プレビュー画像で表示したい状態にセットします。そして、それを保存しあなたのアプリケーションの drawable リソースに置いてください。

この新しい app widget の機能の実装は StackView App WidgetWeather List Widget アプリケーションで見ることができます。

---------------------------

Status bar notifications

コンテンツとしてよりリッチなステータスバー通知をサポートするために、Notification API が拡張されました。また、新しい Notification.Builder クラスによってより簡単に Notification オブジェクトを作成できるようになりました。

新しい機能:

  ・setlargeIcon() を使うことで大きなアイコンによる通知がサポートされました。これは通常ソーシャルアプリケーションで通知元の人物のコンタクトフォトを表示する場合や、メディアアプリでアルバムのサムネイルを表示する場合などに使われます。

  ・setTicker() を使うことで、status bar ticker 内のレイアウトをカスタマイズできます

  ・よりインタラクティブな通知ウィジェットのために、カスタム通知レイアウトのサポートには、PendingIntent のボタンが含まれます。例えば、Activity をスタートさせずに通知から音楽のプレイバックをコントロールできます。

---------------------------

Content loaders

Loader クラスを使うことで新しい framework API では、データの非同期読み込みが簡単になりました。View や Fragment などの UI コンポーネントと組み合わせることで worker スレッドから動的にデータを読み込むことができます。CursorLoader サブクラスは ContentProvider でバックアップされたデータに対して、このような動作を実現するために特別にデザインされています。

必要なことは、新しい loader がリクエストされたりデータが変わった時に呼ばれるコールバックを受け取るための LoaderCallbacks インタフェースを実装し、initLoader() を呼んで Activity や Fragment に対して loader を初期化することだけです。

より詳しい情報は Loaders ドキュメントを読んでください。FragmentListCursorLoaderLoaderThrottle サンプルで loader を使うコード例をみることができます。

---------------------------

Bluetooth A2DP and headset APIs

接続された Bluetooth A2DP とヘッドセットプロファイルデバイスの状態を確認する API が追加されました。例えば、アプリケーションは 音楽を聴くために Bluetooth ヘッドセットが接続されているかどうか識別することができ、適切な通知をユーザーに行えます。また、アプリケーションはベンダー固有の AT コマンドに対するブロードキャストを受け取ることもでき、接続されたデバイスの状態(例えば、接続デバイスのバッテリーが少なくなったなど)をユーザーに通知することができます。

プロファイル定数として A2DP, HEADSET のいずれかと、Bluetooth client が接続・切断されたときに呼ばれるコールバックを受信する BluetoothProfile.ServiceListener を指定して getProfileProxy() を呼ぶことで、個々の BluetoothProfile を初期化することができます。

---------------------------

Animation framework

新しい柔軟性のあるアニメーションフレームワークによって、全てのオブジェクト (View, Drawable, Fragment, Object その他すべて) に対して任意のプロパティをアニメーションすることができます。これは、あるアニメーションのいくつかのアスペクトを定義することができるということです。例えば、

 ・期間 (Duration)
 ・繰り返し回数と振る舞い (Repeat amount and behavior)
 ・時間補間のタイプ (Type of time interpolation)
 ・複数のアニメーションを、同時・連続・指定した遅延後 に再生するように設定
 ・フレーム更新の遅延 (Frame refresh delay)

これらのアニメーションアスペクト、その他オブジェクトの int, float, 16進色 の値はデフォルトで定義できます。つまり、これらのタイプのフィールドを 1 つでも持つオブジェクトは、アニメーションとしてその値を時間に応じて変化させることができるということです。その他のタイプの値をアニメーションさせるには、そのタイプの値をどのように計算するのかを TypeEvaluator インタフェースを実装して、システムに伝える必要があります。

プロパティの値をアニメーションするのに使えるアニメ―タが 2 つあります。ValueAnimatorObjectAnimator です。ValueAnimator はアニメーションする値を計算しますが、アニメーションとして使われるプロパティや特定のオブジェクトを認識しません。これは単純に計算を実行するだけなので、更新を聞き、あなた自身のロジックでデータを処理しなければなりません。ObjectAnimator は ValueAnimator のサブクラスで、アニメーションさせるオブジェクトとプロパティを設定でき、全てのアニメーションワークをハンドルします。つまり、ObjectAnimator にアニメーションさせるオブジェクトと、時間に沿って変化させるオブジェクトのプロパティを与えるだけで、アニメーションが開始することができます。

加えて、LayoutTransition クラスを使って、Activity レイアウトに対して自動遷移アニメーションを作成することができます。レイアウトの一部として遷移を有効にするには、LayoutTransition オブジェクトを生成し、それを setLayoutTransition() で全ての ViewGroup にセットします。このグループにアイテムが追加されたり削除されたりしたときは、つねにデフォルトのアニメーションが走ります。カスタムアニメーションを指定するには、LayoutTransition の setAnimator() を呼んで ValueAnimator や ObjectAnimator などのカスタム Animator を提供します。

より詳しい情報は、Property Animation を見てください。アニメーション API を使ったいくつかのサンプルが API Demos アプリケーションにあります。

---------------------------

Extended UI framework

■ ListView と GridView での複数選択 :
 Multiple-choice selection for ListView and GridView

新しい CHOICE_MODE_MULTIPLE_MODAL モードを setChoiceMode() で指定することで、ListView と GridView で複数アイテムが選択できるようになりました。Action Bar と組み合わせて使用することで、ユーザーは複数のアイテムを選択でき、Action Bar (Multi-choice Action Mode に変わっている) 内のオプションのリストから実行するアクションを選択できます。

複数選択を有効にするには、setChoiceMode(CHOICE_MODE_MULTIPLE_MODAL) を呼び、setMultiChoiceModeListener()MultiChoiceModeListener を登録します。

ユーザーが long-press をアイテムに対して行うと、Action Bar は Multi-choice Action Mode に切り替わります。システムはアイテムが選択されたときに onItemCheckedStateChanged() を呼ぶことで MultiChoiceModeListener に通知します。

複数選択の例は API Demos サンプルアプリケーションの List15.java クラスを見てください。


■ View 変換の新しい API : New APIs to transform views

新しい API によって、あなたの Activity レイアウト内の View に、簡単に 2D, 3D 変換を適用できるようになりました。新しい変換は、レイアウトの位置、向き、透過度などを定義するオブジェクトプロパティのセットを可能にします。

View のプロパティを設定する新しいメソッドとして setAlpha(), setBottom(), setLeft(), setRight(), setPivotX(), setPivotY(), setRotationX(), setRotationY(), setScaleX(), setScaleY(), setAlpha(), その他、が含まれます。

いくつかのメソッドは対応する XML 属性をもっています。この属性をレイアウトファイルで指定するうことで、デフォルト変換として適用される値を設定できます。使用可能な属性として translationX, translationY, rotation, rotationX, rotationY, scaleX, scaleY, transformPivotX, transformPivotY, alpha があります。

これらの新しい View プロパティのいくつかを組み合わせて、上記の新しいアニメーションフレームワークで使用することで、簡単にファンシーなアニメーションをあなたの View に適用することができます。例えば、Y軸周りの View の回転をするには ObjectAnimator にその View と "rotationY" プロパティの開始値と終了値を与えるだけです。


ObjectAnimator animator = ObjectAnimator.ofFloat(myView, "rotationY", 0, 360);
animator.setDuration(2000);
animator.start();



■ 新しい holographic テーマ : New holographic themes

標準システムウィジェットと全体の見た目は再デザインされ、新しい "holographic" としてユーザーインタフェーステーマに組み込まれました。システムは標準の style and theme を使ってシステムにこの新しいテーマを適用します。

Android:minSdkVertion もしくは android:targetSdkVersion が "11" に設定された Android 3.0 platform 用のすべてのアプリケーションはデフォルトで holographic theme を継承します。しかし、もしアプリケーションが自身のテーマを適用するならば、そのテーマが holographic theme を継承したスタイルでない限り、holographic theme は上書きされます。
holographic theme を個々の Activity に適用する、もしくは自身のテーマで継承するには、いくつかの新しい Theme.Holo テーマのうち 1つを使います。もし、あなたのアプリケーションが Android 3.0 よりも低いバージョンと互換性があり、カスタムテーマを適用するならば、プラットフォームのバージョンに応じたテーマを選択しなければなりません。


■ 新しいウィジェット : New widgets

  ・AdapterViewAnimator
    View を切り替えるアニメーションを実行する AdapterView のベースクラス

  ・AdapterViewFlipper
    シンプルな ViewAnimator。これに追加された 2つ、もしくはそれ以上の View 間でアニメーションする。1度に1つの子要素しか表示できない。各子要素間で一定間隔で自動的にフリップするアニメーションをリクエストできる。

  ・CalendarView
    カレンダーをタッチすることでユーザーが日付を選択することができる。ウィジェット内の日付の範囲を設定することができる。
    
  ・ListPopupWindow
    EditText View でタイピング中に表示される候補リストのように、ホスト View をアンカーとして選択リストが表示される。

  ・NumberPicker
    事前に定義した範囲からユーザーが数字を選択できる。ウィジェットは入力フィールドと数字を選択するアップ・ダウンボタンを提供する。入力フィールドをタッチすることでユーザーは値をスクロールでき、さらにタッチすることで現在の値を直接編集できる。位置と文字列をマッピングすることができる。つまり、インデックス位置の変わりに対応する文字列を表示することができる。

  ・PopupMenu
    アンカーとなる View のモーダルポップアップウィンドウ内にメニューをを表示する。ポップアップはアンカー View の下に表示され、十分な room がない場合、上に表示される。もし IME (ソフトキーボード) が表示されていると、ユーザーがメニューをタッチするまで、ポップアップは IME にオーバーラップしない。

  ・SearchView
    Search Manager (これまでの検索ダイアログと同じマナー) を組み合わせて動く検索ボックスを提供する。最近のクエリーを候補として表示することができ、search provider を設定することで候補をカスタマイズできる。このウィジェットは Action Bar で検索を提供する場合に非常に便利である。

  ・StackView
    子要素を 3D スタックとして表示できる View。ユーザーは rolodex のように View をスワイプできる。



 

0 件のコメント:

コメントを投稿

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,''):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

Blogger Syntax Highliter

Version: {V}

http://www.dreamprojections.com/syntaxhighlighter

©2004-2007 Alex Gorbatchev.

'},ClipboardSwf:null,Version:'1.5.1'}};dp.SyntaxHighlighter=dp.sh;dp.sh.Toolbar.Commands={ExpandSource:{label:'+ expand source',check:function(highlighter){return highlighter.collapse;},func:function(sender,highlighter) {sender.parentNode.removeChild(sender);highlighter.div.className=highlighter.div.className.replace('collapsed','');}},ViewSource:{label:'view plain',func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/'+code+'');wnd.document.close();}},CopyToClipboard:{label:'copy to clipboard',check:function(){return window.clipboardData!=null||dp.sh.ClipboardSwf!=null;},func:function(sender,highlighter) {var code=dp.sh.Utils.FixForBlogger(highlighter.originalCode).replace(/</g,'<').replace(/>/g,'>').replace(/&/g,'&');if(window.clipboardData) {window.clipboardData.setData('text',code);} else if(dp.sh.ClipboardSwf!=null) {var flashcopier=highlighter.flashCopier;if(flashcopier==null) {flashcopier=document.createElement('div');highlighter.flashCopier=flashcopier;highlighter.div.appendChild(flashcopier);} flashcopier.innerHTML='';} alert('The code is in your clipboard now');}},PrintSource:{label:'print',func:function(sender,highlighter) {var iframe=document.createElement('IFRAME');var doc=null;iframe.style.cssText='position:absolute;width:0px;height:0px;left:-500px;top:-500px;';document.body.appendChild(iframe);doc=iframe.contentWindow.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write('

'+highlighter.div.innerHTML+'

');doc.close();iframe.contentWindow.focus();iframe.contentWindow.print();alert('Printing...');document.body.removeChild(iframe);}},About:{label:'?',func:function(highlighter) {var wnd=window.open('','_blank','dialog,width=300,height=150,scrollbars=0');var doc=wnd.document;dp.sh.Utils.CopyStyles(doc,window.document);doc.write(dp.sh.Strings.AboutDialog.replace('{V}',dp.sh.Version));doc.close();wnd.focus();}}};dp.sh.Toolbar.Create=function(highlighter) {var div=document.createElement('DIV');div.className='tools';for(var name in dp.sh.Toolbar.Commands) {var cmd=dp.sh.Toolbar.Commands[name];if(cmd.check!=null&&!cmd.check(highlighter)) continue;div.innerHTML+=''+cmd.label+'';} return div;} dp.sh.Toolbar.Command=function(name,sender) {var n=sender;while(n!=null&&n.className.indexOf('dp-highlighter')==-1) n=n.parentNode;if(n!=null) dp.sh.Toolbar.Commands[name].func(sender,n.highlighter);} dp.sh.Utils.CopyStyles=function(destDoc,sourceDoc) {var links=sourceDoc.getElementsByTagName('link');for(var i=0;i');} dp.sh.Utils.FixForBlogger=function(str) {return(dp.sh.isBloggerMode==true)?str.replace(/
|<br\s*\/?>/gi,'\n'):str;} dp.sh.RegexLib={MultiLineCComments:new RegExp('/\\*[\\s\\S]*?\\*/','gm'),SingleLineCComments:new RegExp('//.*$','gm'),SingleLinePerlComments:new RegExp('#.*$','gm'),DoubleQuotedString:new RegExp('"(?:\\.|(\\\\\\")|[^\\""\\n])*"','g'),SingleQuotedString:new RegExp("'(?:\\.|(\\\\\\')|[^\\''\\n])*'",'g')};dp.sh.Match=function(value,index,css) {this.value=value;this.index=index;this.length=value.length;this.css=css;} dp.sh.Highlighter=function() {this.noGutter=false;this.addControls=true;this.collapse=false;this.tabsToSpaces=true;this.wrapColumn=80;this.showColumns=true;} dp.sh.Highlighter.SortCallback=function(m1,m2) {if(m1.indexm2.index) return 1;else {if(m1.lengthm2.length) return 1;} return 0;} dp.sh.Highlighter.prototype.CreateElement=function(name) {var result=document.createElement(name);result.highlighter=this;return result;} dp.sh.Highlighter.prototype.GetMatches=function(regex,css) {var index=0;var match=null;while((match=regex.exec(this.code))!=null) this.matches[this.matches.length]=new dp.sh.Match(match[0],match.index,css);} dp.sh.Highlighter.prototype.AddBit=function(str,css) {if(str==null||str.length==0) return;var span=this.CreateElement('SPAN');str=str.replace(/ /g,' ');str=str.replace(/');if(css!=null) {if((/br/gi).test(str)) {var lines=str.split(' 
');for(var i=0;ic.index)&&(match.index/gi,'\n');var lines=html.split('\n');if(this.addControls==true) this.bar.appendChild(dp.sh.Toolbar.Create(this));if(this.showColumns) {var div=this.CreateElement('div');var columns=this.CreateElement('div');var showEvery=10;var i=1;while(i<=150) {if(i%showEvery==0) {div.innerHTML+=i;i+=(i+'').length;} else {div.innerHTML+='·';i++;}} columns.className='columns';columns.appendChild(div);this.bar.appendChild(columns);} for(var i=0,lineIndex=this.firstLine;i0;i++) {if(Trim(lines[i]).length==0) continue;var matches=regex.exec(lines[i]);if(matches!=null&&matches.length>0) min=Math.min(matches[0].length,min);} if(min>0) for(var i=0;i

ページビューの合計