読者です 読者をやめる 読者になる 読者になる

アンドロイドライブラリ本読んでのメモ


自メモ)
 最近技術本の発売ラッシュだな。。嬉しいけど懐が寂しいorz



50 Android Hacks 開発現場ですぐに役立つヒントとコード

50 Android Hacks 開発現場ですぐに役立つヒントとコード

cocos2d-xの章は2系の話ですね。
今調べてるのは3系だったりするので微妙に使えなくて悩ましい。

の目次見てると微妙に使えなくて厳し目。
まだ即使えそうな感じのものだと後者の2冊のほうがオススメかな。。

知識を増やす的な話では勉強にはなるんだけど。。。



IS01で動かす場合以下で落ちるので下記をコメント
サンプルではどうも使ってないみたい*1

    • shared.ui.actionscontentview.ContentLayout


@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public ContentLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

// we need to be sure we have horizontal layout to add shadow to left border
setOrientation(LinearLayout.HORIZONTAL);
}

カスタム性は少ないみたいだ。。
リソースにはattr.xml等だけみたいなので jar同梱形式でも問題ないとは思われる
ただ左側固定で 右側に出す等の設定はいじれないので微妙な面は有

操作関数は

  • showContent();//バー表示
  • showActions(); //広いバー表示
  • hideContent(秒);//非表示

あたりか・・。

  • EventBus

というお話があり、以前載っててよくわかんなかったなーと思いだし
ちょっとググってメモ



Androidオープンソースライブラリ徹底活用

Androidオープンソースライブラリ徹底活用

@ さんは個人でもOSSのライブラリを積極的にリリースされている方で
よくブログも拝見させて頂いてます(いつもお世話になっております)

  • PhotoView

機能自体はすごく使いやすい感じでした。

  • スワイプズーム
  • ダブルタップズーム*2

ただFragmentで使うと createViewだけじゃなくて
setImageBitmap等再設定したタイミングで再度設定しないと駄目とかが有るかも

PhotoViewAttacher attacher = new PhotoViewAttacher(iv);
  • ダブルタップ処理*3
attacher.onDoubleTap(event);

デフォルトだと 1.0f/2.0f/3.0f と循環する感じの挙動に

  • 元のサイズに戻す
attacher.setScale(1.0f, 0, 0, true);

ここらへんはちょくにコード読むしか無いかな(汗

PS)
つい最近、最新版落としたらIS01でverificationErrorが出てしまったのでpatch(正確にはソース分離)あてる

/*******************************************************************************
 * Copyright 2011, 2012 Chris Banes.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package uk.co.senab.photoview;

import android.annotation.TargetApi;
import android.os.Build;
import android.os.Build.VERSION;
import android.os.Build.VERSION_CODES;
import android.view.MotionEvent;
import android.view.View;

public class Compat {

    private static final int SIXTY_FPS_INTERVAL = 1000 / 60;

    public static void postOnAnimation(View view, Runnable runnable) {
        if (VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
            CompatEx.postOnAnimationJellyBean(view, runnable);
        } else {
            view.postDelayed(runnable, SIXTY_FPS_INTERVAL);
        }
    }


    public static int getPointerIndex(int action) {
        if (VERSION.SDK_INT >= VERSION_CODES.HONEYCOMB)
            return CompatEx.getPointerIndexHoneyComb(action);
        else
            return getPointerIndexEclair(action);
    }

    @SuppressWarnings("deprecation")
    @TargetApi(Build.VERSION_CODES.ECLAIR)
    private static int getPointerIndexEclair(int action) {
        return (action & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT;
    }
}
package uk.co.senab.photoview;

import android.annotation.TargetApi;
import android.os.Build;
import android.view.MotionEvent;
import android.view.View;

public class CompatEx {
    @TargetApi(16)
    static void postOnAnimationJellyBean(View view, Runnable runnable) {
        view.postOnAnimation(runnable);
    }
    
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    static int getPointerIndexHoneyComb(int action) {
        return (action & MotionEvent.ACTION_POINTER_INDEX_MASK) >> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
    }

}


  • universal-image-loader

このライブラリは結構前から知っていたのですが本読んだタイミングでチャレンジしてみようかと。

このバージョン(1.8まで)まではIS01で動作確認OK。最新の1.9系だとライブラリ内部でverificationError出たので無理*4
というかサンプル記述のままだと2系でもエラー。


下記みたいなクラスを作ってラッパにしたけど

  • ImageLoaderUtil.java
public class ImageLoaderUtil {

	public static DisplayImageOptions options;
	
	public static void init(Context context) {
		options = new DisplayImageOptions.Builder()
		.showImageOnLoading(R.drawable.ic_stub)
		.showImageForEmptyUri(R.drawable.ic_empty)
		.showImageOnFail(R.drawable.ic_error)
		.cacheInMemory(true)
		.cacheOnDisc(true)
		.considerExifParams(true)
		//.bitmapConfig(Bitmap.Config.ARGB_4444)//.RGB_565)
		.build();
		
		// see http://qiita.com/chuross/items/e3ca79065d9b67716ace
		File cacheDir = StorageUtils.getCacheDirectory(context);
		ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
				context)
				.memoryCacheExtraOptions(480, 800)
				// default = device screen dimensions
				.discCacheExtraOptions(480, 800, CompressFormat.JPEG, 75, null)
				.taskExecutor(THREAD_POOL_EXECUTOR)
				.taskExecutorForCachedImages(THREAD_POOL_EXECUTOR)
				.threadPoolSize(3)
				// default
				.threadPriority(Thread.NORM_PRIORITY - 1)
				// default
				.tasksProcessingOrder(QueueProcessingType.FIFO)
				// default
				.denyCacheImageMultipleSizesInMemory()
				.memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
				// default
				.memoryCacheSize(2 * 1024 * 1024)
				.discCache(new UnlimitedDiscCache(cacheDir))
				// default
				.discCacheSize(50 * 1024 * 1024).discCacheFileCount(100)
				.discCacheFileNameGenerator(new HashCodeFileNameGenerator()) // default
				.imageDownloader(new BaseImageDownloader(context)) // default
				//.defaultDisplayImageOptions(options)//DisplayImageOptions.createSimple()) // default
				.writeDebugLogs().build();
		ImageLoader.getInstance().init(config);

	}

	public static void displayImage(String uri, final ImageView imageAware) {
		displayImage(uri, imageAware,null,null);
	}

	public static void displayImage(String uri, final ImageView imageAware,SimpleImageLoadingListener listner) {
		displayImage(uri, imageAware,listner,null);
	}

	public static void displayImage(String uri, final ImageView imageAware,
			SimpleImageLoadingListener listner,
			ImageLoadingProgressListener listner_prg) {
		ImageLoader loader = ImageLoader.getInstance();
		loader.displayImage(uri, imageAware,options,listner,listner_prg);
	}


	// ====================
	// copy from AsyncTask
	private static final ThreadFactory sThreadFactory = new ThreadFactory() {
		private final AtomicInteger mCount = new AtomicInteger(1);

		public Thread newThread(Runnable r) {
			return new Thread(r, "AsyncTask #" + mCount.getAndIncrement());
		}
	};

	private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(
			128);

	/**
	 * An {@link Executor} that can be used to execute tasks in parallel.
	 */
	private static final int CPU_COUNT = Runtime.getRuntime()
			.availableProcessors();
	private static final int CORE_POOL_SIZE = CPU_COUNT + 1;
	private static final int MAXIMUM_POOL_SIZE = CPU_COUNT * 2 + 1;
	private static final int KEEP_ALIVE = 1;
	public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(
			CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS,
			sPoolWorkQueue, sThreadFactory);
	// ====================

}

 当初の認識だと
loadImage にしか完了時のbitmapが取得できないいかな?とか思って読込後の表示リフレッシュを悩んでたんですが*5

displayImageでも
SimpleImageLoadingListener と ImageLoadingProgressListener の設定が可能
という事がわかって大分いい感じにできたかなと。


まだ課題タスクに残ってる

  • 上下スクロールでページ切替読込

はまだ出来てないけど。。

あたりを絡めて試行錯誤してみる予定

追記メモ>

*1:Xoom3.2/N7 4.3で確認

*2:IS01はシングルタッチなのでコレで対応可能

*3:3段階程度で拡大の循環をする

*4:ココらへんは以前は LazyLoadで TargetApi使ってる関数を別クラス分けてたのを,面倒だから、おまとめローンとかすると って話だと思う(汗

*5:loadImageだと読み込み完了時に画像がリフレッシュ表示されない