2013年5月8日水曜日

複数のボタンを同時にタップさせないようにする

1つの画面にボタンを2つ配置する。
ボタンを同時のタップすると・・・・・2つのボタンが同時に効いてしまう。

今までこんなことあったっけ!?

と思い調べてみました。
ちなみにAndroid4.0.3でコンパイルしてました。

2.3.3の時はそんなことなかったはずなので、
2.3.3でコンパイルし直して、同様にボタンを同時押ししてみた。

・・・・・起きない。

調べてみると・・・・あった。
3.0かららしいが、どうやらイベントはデフォルトでそれぞれのViewごとで受け付けられるようになっているぽい。
2.3.3までは、あるViewをタップしている間、別のViewはイベントを受け付けられなかったが、
3.0以降はデフォルトでイベント中に別のイベントも受け付けるらしい。

別のViewを受け付けないようにするためには、以下のように、親Viewの属性として「android:splitMotionEvents="false"」を追加する。

<LinearLayout android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:splitMotionEvents="false">
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button1"
android:id="@+id/button1"/>
<Button android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button2"
android:id="@+id/button2"/>
</LinearLayout>
これが書いてある子Viewはイベントを並行して処理しなくなる。

また、いちいちレイアウトに設定したくない場合は、以下のようにstyles.xmlにテーマ、およびスタイルとして設定してもよい。

<style name="AppTheme" parent="android:Theme.Holo.Light">
<item name="android:windowEnableSplitTouch">false</item>
</style>


http://developer.android.com/about/versions/android-3.0.html
Split touch events

Previously, only a single view could accept touch events at one time. Android 3.0 adds support for splitting touch events across views and even windows, so different views can accept simultaneous touch events.

Split touch events is enabled by default when an application targets Android 3.0. That is, when the application has set either the android:minSdkVersion or android:targetSdkVersion attribute's value to "11".

However, the following properties allow you to disable split touch events across views inside specific view groups and across windows.

The android:splitMotionEvents attribute for view groups allows you to disable split touch events that occur between child views in a layout. For example:
<LinearLayout android:splitMotionEvents="false" ... >
...
</LinearLayout>
This way, child views in the linear layout cannot split touch events-only one view can receive touch events at a time.
The android:windowEnableSplitTouch style property allows you to disable split touch events across windows, by applying it to a theme for the activity or entire application. For example:
<style name="NoSplitMotionEvents" parent="android:Theme.Holo">
<item name="android:windowEnableSplitTouch">false</item>
...
</style>
When this theme is applied to an <activity> or <application>, only touch events within the current activity window are accepted. For example, by disabling split touch events across windows, the system bar cannot receive touch events at the same time as the activity. This does not affect whether views inside the activity can split touch events-by default, the activity can still split touch events across views.
For more information about creating a theme, read Applying Styles and Themes.

OTOYとMozilla、プラグイン不要のJavaScriptライブラリ「ORBX.js」発表

 米ソフトウェア会社のOTOYとMozillaが手を組んで、デスクトップPC向けのネイティブアプリや動画などのコンテンツを、HTML5対応のあらゆるブラウザでシームレスに実行できるようにしたJavaScriptライブラリ「ORBX.js」を5月3日に発表した。

 ORBX.jsではWindowsやLinux、Mac OS X向けのPCアプリをクラウドで仮想化し、モバイルブラウザを含むHTML5対応のあらゆるブラウザにストリーミングできるという。

 ORBX.jsに含まれる独自開発のビデオコーデック「ORBX」により、HDビデオをJavaScriptにデコードして、テレビ番組やクラウドゲーム、透かし技術入りの動画などをブラウザで再生することも可能。H.264やFlash、Javaなどのプラグインは不要で、Firefox、Chrome、Opera、Safari、IE 10など、HTML5対応の全ブラウザに対応する。

 同社はこの技術を使って、「Autodesk 3ds Max 2014」「Adobe Photoshop CS6」およびValveのPCゲームサービスを、HTML5を通して全主要ブラウザ上でJavaScriptのみを使って実行するデモを披露した。

 これにより、PCネイティブのアプリを離れてWebアプリへと移行する動きが加速されるとMozillaは解説。「Mozillaの目標は、どんなデバイスでもWebサイトが同じように見え、実行されるよう、Web上のコンテンツとメディアのオープンなエコシステムを推進することにある」と説明する。

 OTOYも「我々は完全なネイティブPC体験をHTML5とJavaScriptを通じて実現する方法を発見した。これはオープンなWebの勝利であり、HTML5はいずれ、デスクトップやテレビ、ゲーム機、モバイル端末上のレガシーOSに取って代わると予想する」とコメントしている。

 ORBX.jsの次世代HTML5ビデオは、「WebをDRMから解放する」ことも目指している。著作権管理問題の解決策として、クラウド内でストリームに透かし技術を施すことにより、ブラウザでのDRMは不要になると説明している。