これ以上CustomWebViewで消耗しないためのAndroid用ライブラリ

webviewに半年ほど消耗してるので、カッとなって書いた。

github.com

今まで十数回とWebViewを継承したクラスを作ってきました。
ネイティブアプリでも利用規約やライセンスの表示などは必ずと言っていいほどWebViewを利用します。

残念なことに、AndroidのWebViewはちょっと使いづらいです。
そこでWebView継承したカスタムWebViewを毎回用意するのですが、いつも同じこと書いてるので、少し抽象化して汎用的な便利WebViewをライブラリとして公開しました。

LxWebViewの特徴を簡単に紹介します。

続きを読む

androidの5系の新しいapi(+Rxjava)の調査も兼ねて、小さいはてブアプリ作った

見出し通りの内容ですが、Androidは5.0(Api Level 21)でマテリアルデザインが採用されたこともあって見た目に関わるapiが色々増えました

5系対応のサンプルコードはそこそこみてたんですが実際に触ってみないとわからないことも多いし、仕事にそろそろマテリアル対応とかもありそうなので 土日を使って小さなアプリを作りながら色々触れてみることにしました

今回調査したのは、

  • 左上のクルクルする矢印アイコンの実装方法
  • リップルエフェクト(波紋のように広がるエフェクト)の実装方法
  • サポートライブラリがどこまで対応してるか
  • RecyclerViewの実装方法

加えて、最近流行っているRxJavaも気になっていたので、[ネットワーク通信] -> [リストアダプターに流し組む]部分をRxJava(+Retrofit)で実装しました

クルクルする矢印アイコンの実装方法

クルクルする矢印のアイコンはサポートライブラリで提供されていて、
利用するにはappcompat-v7をいれます

compile 'com.android.support:appcompat-v7:21.+'

あとはこんな感じのテンプレコードを書けば動きます。

drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
drawerToggle = new ActionBarDrawerToggle(this, drawerLayout, R.string.start, R.string.stop);
drawerToggle.setDrawerIndicatorEnabled(true);
drawerLayout.setDrawerListener(drawerToggle);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
getSupportActionBar().setDisplayShowHomeEnabled(true);
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        return drawerToggle.onOptionsItemSelected(item) || super.onOptionsItemSelected(item);
    }

    @Override
    protected void onPostCreate(Bundle savedInstanceState) {
        super.onPostCreate(savedInstanceState);
        drawerToggle.syncState();
    }

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
        drawerToggle.onConfigurationChanged(newConfig);
    }

ActionBarDrawerToggleってv4のサポートライブラリの方にもあって、それに気づかないと結構ハマります

リップルエフェクト(波紋のように広がるエフェクト)の実装方法

リップルエフェクトもデフォルトのものは、SDKが提供してくれていて、
エフェクトを掛けたいviewのbackgroundに指定します

android:background="?android:attr/selectableItemBackground"

実はもう一種類あって

android:background="?android:attr/selectableItemBackgroundBorderless"

こっちはviewを跨いだ波紋が広がるエフェクトになるっぽい? のですが、minSDKが21なのでLollipopにしか使えません。

RecyclerViewの実装方法

Adapterを作るのはListViewを同じ、RecyclerView.Adapterの実装は簡略化すると概ねこんな感じ、

public class EntryAdapter extends RecyclerView.Adapter<EntryAdapter.ViewHolder> {
    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    // viewをinflateしてViewHolderを作成する
        View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.cell_xxx, parent, false);
        return new ViewHolder(view);
    }
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
    // getView相当の処理(view.setText() etc...)
    }
    @Override
    public int getItemViewType(int position) {
        return // viewTypeを返す;
    }
}

昔のAdapterの実装とほとんど変わんないのですが、新しい概念としてViewTypeというのが追加されてて
複数のviewをレンダリングするタイプのリストを作成したい場合はgetItemViewTypeをOverrideしてよしなに出来る
Activity側はこんな感じ

RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(layoutManager);
entryAdapter = new EntryAdapter();
recyclerView.setAdapter(entryAdapter);
サポートライブラリがどこまで対応してるか

これは正直ちゃんと調べてないのでわからないですが、少なくとも上の3つはサポートライブラリで対応できました!!
(気になるの他に何かあったかな..)

RxJava

[ネットワーク通信] -> [リストアダプターに流し組む]はこんな感じに書ける
そこそこ複雑なリストの処理してるけど、とても完結でわかりやすく書ける
学習コスト低いのでコスパ的に考えるとかなりいい気がする 特にRetrofitがRxjava対応していてホント便利だった
使い方は、wikiサンプル見れば簡単な処理ならすぐ書けそう

        category.observable(app)
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .doOnSubscribe(() -> {
                // something..
                })
                .onErrorReturn(throwable -> {
                // something..
                })
                .map(entries -> {
                // something..
                })
                .flatMap(Observable::from)
                .groupBy(entry -> {
                // something..
                })
                .subscribe(observable -> {
                    if (observable.getKey() == EntryType.onlyTitle) {
                        observable.subscribe(entryAdapter::add);
                    } else if (observable.getKey() == EntryType.WithImage) {
                        observable
                                .buffer(2)
                                .filter(// something )
                                .subscribe(entryAdapter::add);
                    }
                });
今回作ったアプリ

5.0用のサンプルアプリ程度の気持ちで作ってたんですが、
やる気が続いたら継続的に開発するつもりです

(日記)久しぶりにイヤフォン買った

[結論]
XBA-H3最高すぎるから買った方がいい

昔からいわゆるオーディオオタクで,あれやこれやと色々イヤフォン買ってた

2008年あたりがピークで,当時は価格コムのヘッドフォン・イヤフォンページに常駐して, 情報を集めるのが日課になってた,その頃は学生でバイトもしてなかったのでそれこそ年に一回お年玉を使って高いイヤフォンを買うみたいな感じだったので本当にミスれないという気持ちだったのを覚えてる

今まで買ってきたイヤフォンは列挙すると

少しでも高級イヤフォンの世界に足を踏み込んだことがあればわかると思うんだけど,ほんとに沼にはまっていく感じで徐々に高いのが欲しくなってくる.4,5万の世界になってくるとヘッドフォン買ったほうがいい気もしてくるし,DAP(音楽プレイヤー)選びとかやポータブルアンプも揃えたくなってくる.そうなってくるといよいよ学生にとっては手を出せない価格帯になってくるので2-3年ほとんど高いイヤフォンとかは買わなくなった.

この春から働くようになったんだけど,職場は結構騒がしいので仕事中音楽聞いてる.たまたま僕の周りのエンジニアの方たちがイヤフォンとか詳しい人が多くて,いろいろ話してたらまたイヤフォン熱が高まってきていて,つい一昨日くらいにamazonで final audio designってところのPiano Forte Ⅱっていうのをポチった.

このイヤフォンは3000円くらいでとても良心的な価格なんだけど,めっちゃコスパ高くていい音がする.あと形状がカナル型なんだけどイヤーピースはなしっていう不思議なデザインを採用してて面白い.とはいっても価格相応な部分もあって,ジャンルを選ぶ感じでゴリゴリのライブ風イコライザーがかかっているように聞こえる曲もあったり,ck-9とか好きな人間からすると中音から高音にかけての解像度の低さが気になった(ミサワ顔)

そんな不満を抱えた状態で久しぶりに価格コム見てたら,SonyXBA-H3ってのを見つけた レビューとか見てるとどこもかなりいい評価してて,なんかどうしようなく欲しくなってさっき渋谷のビックカメラ行って衝動買いしてきた.

結論から言うとこの機種は本当に素晴らしかった
ダイナミックドライバ一つと2系統のBA(バランスド・アーマチュア)ドライバを備えた超豪華フラグシップモデルだけあって,音の分離が素晴らしくて,とても自然な感じになっている.想像していたよりかなり低音は強かったのでイコライザで多少調節してしまっているけど,音のバランスもかなり好みだった(ミサワ顔) しかもこの機種はコードが交換できるので断線してしまっても安心できるし,共通の規格に準拠はしてないらしいけどSHURE製のコードとかも刺さるらしい. 唯一難点をあげるなら本体がちょっとでかいかなーという気もするけどしょうがない気もする.だいぶ高い買い物だけどイヤフォンの沼をやっと抜けれたと思うとまあいいかなって思う

ちなみにヘッドフォンはUltimate Ears UE 6000 ってやつ使ってて,かなり好みが分かれそうな機種なんだけど高音が綺麗でオススメです.

次は小さいタイプのUSBアンプほしいなー

gradleでAndroid-Bootstrapを使う

本エントリで紹介する方法で動作しますが 多分もっといい方法があると思います

( gradleはじめて3日目の初心者です.正しいビルド方法をご存知のかた教えて下さい )

Android-Bootstrapの簡単な紹介

リポジトリ : Bearded-Hen/Android-Bootstrap
一言で説明するとtwitter Bootstrapみたいなものをandroidのviewでも使えるようにしようっていうライブラリ
出来たばかりのライブラリなので不自由なところもあるけど,気軽にfont-awesomeが使えるようになったりかなりデザインが楽になるのでエンジニアにとっては嬉しい

f:id:kazy1991:20140114055042p:plain

続きを読む

Chrome for Macのファビコンが表示されない件

突然 chromeのブックマークのファビコンが消えてしまっていつまで経っても直らなかった場合の対処法

sudo rm  ~/Library/Application\ Support/Google/Chrome/Default/Favicons

Chrome/Default/Faviconsってとこにファビコン管理してるsqliteのデータベースがあるから,これを消してchromeを再起動すると直った