AndroidでIOSと同じようなレイアウトに似せるFWの考察
エントリ分割しました。
stackoverFlowで [android iPhone Style] で検索するとワラワラでてきますね。
海外の人も同じようなオーダされているようなので、日本のAndroid開発者だけの悩みではないのかも
(劣化IOSコピーの作成
企画の方のIOS至上主義みたいなのがよく感じるな。。。
消費者的にもそんな感じなのでしょうかね??*1
ターゲットが Android も IOSも両方持ってるヘビーユーザが対象なのでしょうか(汗
ただIOSユーザはAndroidの操作感に凄く違和感を感じるそうなので
それで合わせてということらしい。
よちよちAndroid でもお話聞いた感じだと
とかいう話は結構あるみたい。
こう考えると
プログラマにもデザインソフトで加工できる能力は必要かな
- デザイナ素材も一枚絵が多い
- アニメーションさせる画像を作る場合、自分で編集しろってこと?
- ココらへん簡単に補完アニメーションとか作れるアプリ等があると嬉しいんだけどな‥‥‥
とかはよく考えます(汗
なまとめされている方もいらっしゃるようですがそこら辺企画レベルではアンマリ認識共有されていないのかも。。。(汗
一応海外でもその手の需要はあるようで
な特集ページも有り
それはさておき、下記は調べてる(調べたメモ)
Toggle Switch_A)
ただしAPI8以上の関数を使ってる
結構綺麗なんだけどね。。
一応 IS01で動かすようにはしてみたけど全部のデモは動かせず。。
2.1のREGZAでは動くので、なんか違うんかもしれない・・
修正したのは
実際使ってみる編>
使うレイアウトの一番外側のレイアウトに
xmlns:mySwitch="http://schemas.android.com/apk/res-auto" mySwitch:属性名 で設定
で動きますね。。
この書き方は
同一Project内なら検索可能(LibraryProjectみたいにまたぐと駄目)
drawableに以下をコピー
sw_XXにリネムして以下をvalues/に
ただこれをそのままは難しくて
- switch_track_green.xml => switch_track_silver.xml とか作って銀色対応をする
- ボタンの位置が オフ/オン になってる*3
- ボタンフォントのサイズをsw_styles.xmlで指定されているので マルチ解像度対応がちと大変
Toggle Switch_B)
これはAPI4でもOK
demoをみると
app:background_switch="@drawable/button_switch_facebook"
はselectorを指定できるのでいけるかなとおもったけど
IS01で動かすには以下修正必要
case R.styleable.SwitchView_background_switch: if(a.getDrawable(attr) instanceof StateListDrawable){ isStateListDrawable =true; stateListDrawable =(StateListDrawable) a.getDrawable(attr); try { stateListDrawable.mutate(); // make sure that we aren't sharing state anymore } catch (Exception e) { }
修正したのは
実際使ってみる編>
1クラスなのでコピーして試してみた感じだと
- SwitchView/res/values/attrs.xml を要コピー
- SwitchView/res/drawable/ あたりのデフォルト画像も必要
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res/com.hogedrivn" //☆ style="@style/behindMenuScroll" > <LinearLayout style="@style/behindMenuScrollContent" android:layout_marginTop="50dip"> <com.appspheregroup.android.swichview.SwitchView android:layout_marginTop="8dip" android:id="@+id/switchView1" android:layout_width="wrap_content" android:layout_height="wrap_content" app:background_switch="@drawable/button_switch_facebook" app:text_off="ほげ" app:text_on="ふが" />
な感じで ☆の
が必要
xmlns:app="http://schemas.android.com/apk/res/パッケージ名
参考)
Toggle Switch_C)
一応IS01で動くように直したの
これはAndroid4のSwitchのbackportらしい。
ただこっちに関しては
[IOSに似てない]
っていうので却下されそうな気もするんだけどなー。
ただIOS7に関してはフラットスタイルって形でAndroid4に寄せてきてる気もするので
その状況次第ではいけるのかもしれない‥‥‥
- 組込用テストプロジェクトに入れてみた感じだとこんなイメージ
としてコピー。
自分が試してたテストプロジェクトだと
複数のswを入れていて名前空間がぶつかったので
<attr name="textColor" format="color" /> => <attr name="textColor_" format="color" />
みたいな形に変更
従って
ts = appearance.getDimensionPixelSize(R.styleable.TextAppearanceSwitch_textSize, 0); => ts = appearance.getDimensionPixelSize(R.styleable.TextAppearanceSwitch_textSize_, 0);
な形のコード修正が必要になります
- string.xml
<string name="textOn">ON</string> <string name="textOff">OFF</string>
追加
drawable/switch_XXX.xml
drawable-xhdpi/XXX.png
コピー
レイアウトに対する設置は
上記の layout-autoと同じ形で参照
res/themes.xmlのActivity用のスタイルに
<item name="switchStyle">@style/switch_light</item> <item name="switchStyle">@style/switch_dark</item>
のどちらかを追加。なんか設定しないと使えないみたい。
情報源)
- http://qiita.com/lychee/items/e81cc3f618d2c92b8667
- Switch backported for Android Api level 8+ Froyo, Gingerbread & co ankri.de | ankri.de - Java, Android, Programming & Stuff
ActionSheet)
これはActionSheetもどき。Androidだと QuickActionとか使いたいもんですけどね・・。
ソースコードはココらしい)
動かしてみた感じだと
Menuの代わりに ActionSheetを出す流れ
他にも「XMLだけでIOSダイアログを作る」
は あいぽんフリークの人にはウケるかもな・・*4
今はIOS7が出るという話で凄いもちきり
iOS 7 と iOS 6 のアイコン実際に比べてみたが…。角丸アイコン向けに合わせて作ったのはどう対応していくべきか。 URL
2013-06-11 04:49:34 via web
Picker)
これはPickerの似せたもの。試作は作ったことあるけど
「IOSの利点機能をあえてAndで実装したのをユーザさんに見せるとIOSのウリがなくなってしまうかも?((IOSのかっこいいUIの代表例らしい<ピッカー))」
で不採用になってたりも。。。(汗
日本語の意味よくわからないです〜 ><
RadioButton)
これはできないかどうか? ときかれてたから凄く参考になるかも*5
@kojiokbさんがすでに試されていたよう。状況から見ると要検証かも
- http://twitter.com/kojiokb/status/303382969056370688:twitter:detail:right
- http://twitter.com/kojiokb/status/303383435492352001:twitter:detail:right
リストビュー)
こっちのUITableViewもどきのほうが実際近いかもな‥‥_
あったあったuitableview4androidとかjustやな URL
- GitHub - DayS/uitableview4android: Provide an Android list with the look & field and sections of iOS UITableView
- GitHub - DayS/uitableview4android-test
うーん。あんまり大きい android library project以外は jar同梱提供系 にしてもらったほうがいい って話があるから微妙だな。。(汗難しいわ‥‥‥
URL みてるけどこれサンプルプロジェクトが一見何してるか凄くわかりづらいorzUITableCellView とかで中身にEditText等フレキシブルに突っ込む場合はカスタムUITableCellView作らないと駄目な感じ
まあぶっちゃけ既成記述で記述できないような仕様が変なんだよね(日本の奴だとよくある まあ自分が決めるのではないので仕方ないけどな‥‥‥
タブ)
http://stackoverflow.com/questions/2677698/android-iphone-style-tabhost
- GitHub - AdilSoomro/Raised-Center-Tab-in-Android: Customized tabhost having raised center tab.
- GitHub - mta452/iTab: iOS like tabbar for Android with auto gradient shaping
IOSは下タブ
GameCenter っぽいの)
rank-park自体の実装は URL が参考になりそう。WebViewベースっぽい?だとしたらNakamapみたいな感じなのかな?(制限がなければいいけど・・・
rank-park の実装見てるけど 1)com.rankpark.Rankpark_Ranking をManifest登録 2)端末ID取得 3)RankPark.rp_XX 系の関数でアクセスか・・ #yochiand
でも4系だとSetting周りに制限ついた気がするので、挙動は要確認する必要はあるかも Q/Aにノウハウとか記載が全く無いようなのでちょっと不親切かもな#yochiand
商用利用とかの場合はどうなんだろう?
規約まで見てみないとわからないかもしれない。。
ちょっと重い(PHP製っぽいからかな?)
仕事でnode.js使ってるプロジェクトあるけど
現状ですら得点の送信が遅いって話があってまずいな。。とか思ってたりしてる。
<でもPHP使ってる別プロジェクトのやつだと
起動時のPHPアクセスの時点でロックかかって場合によっては
起動が30秒以上かかる or 起動失敗 とかのアプリも有るので
作り次第なのかもしれない・・*6
追記)
rank-park2.0ベースのサンプル改造
そういえば、rank-park 1.4 で繋いだらエラーでて落ちるので、2.0用に以前配布されてたサンプル触って変更してた。パッケージ名を自動取得なので登録パッケージ名と一致させないとsendScoreあたりでエラーになるかんじ。過去互換ない感じなのかな。。。
- libs/rankparkSDK-2.0.jar に差替
- com.example,rankpark.test => com.sample で変更(ライブラリ内部で、ANDROID_ID/パッケージ名を自動取得するっぽいので)
- AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.sample" android:versionCode="1" android:versionName="1.0" > <!-- package="com.example.rankpark.test" -->
-
- src/com/sample/MainActivity
package com.sample; import java.io.IOException; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Color; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.LinearLayout; import com.rankpark.RankPark; public class MainActivity extends Activity implements OnClickListener{ private Button btn; private Button btn1; private Button btn2; private Button btn3; // private String deviceId;//端末ID // private Context context=this; private Thread rankpark_thread;//ダイアログThread private ProgressDialog mProgressDialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout mLayout = new LinearLayout(this); mLayout.setOrientation(LinearLayout.VERTICAL); mLayout.setBackgroundColor(Color.WHITE); // deviceId = Settings.Secure.getString( // this.getContentResolver(), Settings.Secure.ANDROID_ID); btn=new Button(this); btn.setText("Web"); btn.setOnClickListener(this); btn1=new Button(this); btn1.setText("スコア&Web"); btn1.setOnClickListener(this); btn2=new Button(this); btn2.setText("スコア送信1"); btn2.setOnClickListener(this); btn3=new Button(this); btn3.setText("スコア送信2"); btn3.setOnClickListener(this); mLayout.addView(btn); mLayout.addView(btn1); mLayout.addView(btn2); mLayout.addView(btn3); setContentView(mLayout); } public void onClick(View v) { if(v==btn){ //rank-park 表示(ゲームスコアは送信されません) //RankPark.rp_view(this,"com.sample",deviceId); RankPark.startActivity(this); } if(v==btn1){ //rank-park 表示とゲームスコアの送信を行います //RankPark.rp_score(this,"com.sample",deviceId,"20"); try { RankPark.sendScore(this,20); RankPark.startActivity(this); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } if(v==btn2){ //rank-park ゲームスコアの送信のみを行います //RankPark.rp_register(this,"com.sample",deviceId,"40",true); try { RankPark.sendScore(this,40); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } } if(v==btn3){ //rank-park ゲームスコアの送信のみを行います mProgressDialog = ProgressDialog.show(this, "", "スコア送信中..", false); rankpark_thread= new Thread() { @Override public void run() { try { rankpark_score(); }catch (Exception e) { } } }; rankpark_thread.start(); } } public void rankpark_score(){ Log.d("rankpark_score","rankpark_score"); //RankPark.rp_register(this,"com.sample",deviceId,"40",false); try { RankPark.sendScore(this,40); } catch (IOException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } if (mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } } }
OS標準で入ってるApacheで
辺りだと
環境構築が要らない(Railsは運用環境構築大変)
があるからそこは違うんだろうけどなとか思うわけなんだけどな・・
でも個人のその手の鯖側作ろうとすると面倒ではあるので
そういう面では楽かもしれない*8