【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案_第1頁
【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案_第2頁
【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案_第3頁
【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案_第4頁
【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案_第5頁
已閱讀5頁,還剩70頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】簡要介紹下超級巨圖Glide3.7和Glide4.1.1優(yōu)化加載方案

/upload/information/20200311/46/179849.jpg/upload/information/20200311/46/179850.jpg

相信大家看到上面的巨圖會很懵逼~最近產(chǎn)品經(jīng)理朝令夕改,有點煩,要不是還有外包項目在做,就不想干了,所以忍了,先做完十一后再說,畢竟找工作還是有點折騰,需要更高的薪水和技術的沉淀。好吧,啰嗦了一把,下面開始正題,最近一直在研究glide3.7和glide4.1.1,兩者的方法確實改變不少,網(wǎng)上給的方案大多都是淺顯的使用,目前沒有找到git上詳細使用的開源的統(tǒng)一的代碼,我也是查了一周的代碼,最后還是搞出來了一些東西,希望可以幫到你。

首先是glide3.7的使用,比較單一,如果你要結合okhttp一起使用,全部的代碼引用如下代碼://glide37

compile

'com.github.bumptech.glide:glide:3.7.0'

compile

'com.github.bumptech.glide:okhttp3-integration:1.4.0@aar'

compile

'com.squareup.okhttp3:okhttp:3.4.2'

使用的話如下代碼:GlideUtil.display(context,

viewHolder.iv_imgurl,

ratings.getSku_p_w_picpath(),

GlideOptionsFactory.get(GlideOptionsFactory.Type.RADIUS));

Glide.with(context).load(ratings.getSku_p_w_picpath()).skipMemoryCache(true).diskCacheStrategy(DiskCacheStrategy.NONE).into(viewHolder.iv_imgurl);

GlideOptions

glideOptions

=

new

GlideOptions(R.drawable.ic_def_loading,

R.drawable.ic_def_loading,

300);

GlideUtil.display(context,

viewHolder.iv1,

ratings.getImg_url(),

glideOptions);

這里說一下,我封裝了一下3.7的方法,可以自定義圓角,但是清理緩存的操作建議還是用原生的方法。

可以參考之前寫的demo:

/geeklx/MyApplication/tree/master/P009_Glide圖片緩存

3.7還是很好用的,目前項目中大家應該都在用這個版本,不過4.0出來以后大幅度修改了API讓很多人望而卻步,我也是因為怕被技術無形的淘汰,逼了自己一把,把4.1.1的版本API都看了一遍,整體感覺4.1.1的版本還是要好一些,如果說3.7只是基礎的用法,那么4.1.1就是晉升之路,學會后你會發(fā)現(xiàn),有很多市面上你見過的通用的業(yè)務都不需要你去自己寫頁面,glide4.1.1會給你提供很好的自定義解決方案。

下面開始正題:當你遇到清明上河圖或者微博的大圖預覽,你會怎么做?是不是按部就班的畫頁面,傳值,折騰幾夜,然后也做出來了,挺辛苦和費勁的?,F(xiàn)在glide4.1.1就提供了很好的便利,再說4.1.1之前先看看3.7怎么封裝它,讓它也實現(xiàn)功能。

Glide3.7基礎用法以及大圖預覽放大效果:

LargeImageViewTarget:package

com.example.shining.p042_largep_w_picpath.glide37;

import

android.graphics.drawable.Drawable;

import

android.view.View;

import

com.bumptech.glide.request.animation.GlideAnimation;

import

com.bumptech.glide.request.target.ViewTarget;

import

com.shizhefei.view.largep_w_picpath.ILargeImageView;

import

com.shizhefei.view.largep_w_picpath.factory.FileBitmapDecoderFactory;

import

java.io.File;

/**

*

A

base

{@link

com.bumptech.glide.request.target.Target}

for

displaying

resources

in

*

{@link

android.widget.ImageView}s.

*

*

@param

<Z>

The

type

of

resource

that

this

target

will

display

in

the

wrapped

{@link

android.widget.ImageView}.

*/

public

class

LargeImageViewTarget

extends

ViewTarget<View,

File>{

private

ILargeImageView

largeImageView;

public

<V

extends

View

&

ILargeImageView>

LargeImageViewTarget(V

view)

{

super(view);

this.largeImageView

=

view;

}

/**

*

Sets

the

given

{@link

android.graphics.drawable.Drawable}

on

the

view

using

*

{@link

android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}.

*

*

@param

placeholder

{@inheritDoc}

*/

@Override

public

void

onLoadStarted(Drawable

placeholder)

{

largeImageView.setImageDrawable(placeholder);

}

/**

*

Sets

the

given

{@link

android.graphics.drawable.Drawable}

on

the

view

using

*

{@link

android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}.

*

*

@param

errorDrawable

{@inheritDoc}

*/

@Override

public

void

onLoadFailed(Exception

e,

Drawable

errorDrawable)

{

largeImageView.setImageDrawable(errorDrawable);

}

@Override

public

void

onResourceReady(File

resource,

GlideAnimation<?

super

File>

glideAnimation)

{

largeImageView.setImage(new

FileBitmapDecoderFactory(resource));

}

/**

*

Sets

the

given

{@link

android.graphics.drawable.Drawable}

on

the

view

using

*

{@link

android.widget.ImageView#setImageDrawable(android.graphics.drawable.Drawable)}.

*

*

@param

placeholder

{@inheritDoc}

*/

@Override

public

void

onLoadCleared(Drawable

placeholder)

{

largeImageView.setImageDrawable(placeholder);

}

}

OkHttpProgressGlideModule:package

com.example.shining.p042_largep_w_picpath.glide37;

import

android.content.Context;

import

android.os.Handler;

import

android.os.Looper;

import

com.bumptech.glide.Glide;

import

com.bumptech.glide.GlideBuilder;

import

egration.okhttp3.OkHttpUrlLoader;

import

com.bumptech.glide.load.model.GlideUrl;

import

com.bumptech.glide.module.GlideModule;

import

java.io.IOException;

import

java.io.InputStream;

import

java.util.Map;

import

java.util.concurrent.ConcurrentHashMap;

import

okhttp3.HttpUrl;

import

okhttp3.Interceptor;

import

okhttp3.MediaType;

import

okhttp3.OkHttpClient;

import

okhttp3.Request;

import

okhttp3.Response;

import

okhttp3.ResponseBody;

import

okio.Buffer;

import

okio.BufferedSource;

import

okio.ForwardingSource;

import

okio.Okio;

import

okio.Source;

//

TODO

add

<meta-data

android:value="GlideModule"

android:name="OkHttpProgressGlideModule"

/>

//

TODO

add

<meta-data

android:value="GlideModule"

tools:node="remove"

android:name="egration.okhttp.OkHttpGlideModule"

/>

//

or

not

use

'okhttp@aar'

in

Gradle

depdendencies

public

class

OkHttpProgressGlideModule

implements

GlideModule

{

@Override

public

void

applyOptions(Context

context,

GlideBuilder

builder)

{

}

@Override

public

void

registerComponents(Context

context,

Glide

glide)

{

OkHttpClient.Builder

builder

=

new

OkHttpClient.Builder();

workInterceptors().add(createInterceptor(new

DispatchingProgressListener()));

glide.register(GlideUrl.class,

InputStream.class,

new

OkHttpUrlLoader.Factory(builder.build()));

}

private

static

Interceptor

createInterceptor(final

ResponseProgressListener

listener)

{

return

new

Interceptor()

{

@Override

public

Response

intercept(Chain

chain)

throws

IOException

{

Request

request

=

chain.request();

Response

response

=

ceed(request);

return

response.newBuilder()

.body(new

OkHttpProgre***esponseBody(request.url(),

response.body(),

listener))

.build();

}

};

}

public

interface

UIProgressListener

{

void

onProgress(long

bytesRead,

long

expectedLength);

/**

*

Control

how

often

the

listener

needs

an

update.

0%

and

100%

will

always

be

dispatched.

*

*

@return

in

percentage

(0.2

=

call

{@link

#onProgress}

around

every

0.2

percent

of

progress)

*/

float

getGranualityPercentage();

}

public

static

void

forget(String

url)

{

DispatchingProgressListener.forget(url);

}

public

static

void

expect(String

url,

UIProgressListener

listener)

{

DispatchingProgressListener.expect(url,

listener);

}

private

interface

ResponseProgressListener

{

void

update(HttpUrl

url,

long

bytesRead,

long

contentLength);

}

private

static

class

DispatchingProgressListener

implements

ResponseProgressListener

{

private

static

final

Map<String,

UIProgressListener>

LISTENERS

=

new

ConcurrentHashMap<>();

private

static

final

Map<String,

Long>

PROGRESSES

=

new

ConcurrentHashMap<>();

private

final

Handler

handler;

DispatchingProgressListener()

{

this.handler

=

new

Handler(Looper.getMainLooper());

}

static

void

forget(String

url)

{

LISTENERS.remove(url);

PROGRESSES.remove(url);

}

static

void

expect(String

url,

UIProgressListener

listener)

{

LISTENERS.put(url,

listener);

}

@Override

public

void

update(HttpUrl

url,

final

long

bytesRead,

final

long

contentLength)

{

//System.out.printf("%s:

%d/%d

=

%.2f%%%n",

url,

bytesRead,

contentLength,

(100f

*

bytesRead)

/

contentLength);

String

key

=

url.toString();

final

UIProgressListener

listener

=

LISTENERS.get(key);

if

(listener

==

null)

{

return;

}

//長度是錯誤的移除監(jiān)聽

if

(contentLength

<=

bytesRead)

{

forget(key);

}

if

(needsDispatch(key,

bytesRead,

contentLength,

listener.getGranualityPercentage()))

{

handler.post(new

Runnable()

{

@Override

public

void

run()

{

listener.onProgress(bytesRead,

contentLength);

}

});

}

}

private

boolean

needsDispatch(String

key,

long

current,

long

total,

float

granularity)

{

if

(granularity

==

0

||

current

==

0

||

total

==

current)

{

return

true;

}

float

percent

=

100f

*

current

/

total;

long

currentProgress

=

(long)

(percent

/

granularity);

Long

lastProgress

=

PROGRESSES.get(key);

if

(lastProgress

==

null

||

currentProgress

!=

lastProgress)

{

PROGRESSES.put(key,

currentProgress);

return

true;

}

else

{

return

false;

}

}

}

private

static

class

OkHttpProgre***esponseBody

extends

ResponseBody

{

private

final

HttpUrl

url;

private

final

ResponseBody

responseBody;

private

final

ResponseProgressListener

progressListener;

private

BufferedSource

bufferedSource;

OkHttpProgre***esponseBody(HttpUrl

url,

ResponseBody

responseBody,

ResponseProgressListener

progressListener)

{

this.url

=

url;

this.responseBody

=

responseBody;

gressListener

=

progressListener;

}

@Override

public

MediaType

contentType()

{

return

responseBody.contentType();

}

@Override

public

long

contentLength()

{

return

responseBody.contentLength();

}

@Override

public

BufferedSource

source()

{

if

(bufferedSource

==

null)

{

bufferedSource

=

Okio.buffer(source(responseBody.source()));

}

return

bufferedSource;

}

private

Source

source(Source

source)

{

return

new

ForwardingSource(source)

{

long

totalBytesRead

=

0L;

@Override

public

long

read(Buffer

sink,

long

byteCount)

throws

IOException

{

long

bytesRead

=

super.read(sink,

byteCount);

long

fullLength

=

responseBody.contentLength();

if

(bytesRead

==

-1)

{

//

this

source

is

exhausted

totalBytesRead

=

fullLength;

}

else

{

totalBytesRead

+=

bytesRead;

}

progressListener.update(url,

totalBytesRead,

fullLength);

return

bytesRead;

}

};

}

}

}

這里需要注意一下,需要延遲配置GlideModule,

xml:<!--

Glide與OkHttp3集成

-->

<meta-data

android:name="com.example.lagerp_w_picpath_test.glide.OkHttpProgressGlideModule"

android:value="GlideModule"

/>

onCreate:final

Glide

glide

=

Glide.get(this);

OkHttpProgressGlideModule

a

=

new

OkHttpProgressGlideModule();

a.registerComponents(this,

glide);

這里這樣寫的原因是在你加載圖片的時候給加載的進度過程,自定義OkHttpProgressGlideModule,

ProgressTarget:package

com.example.shining.p042_largep_w_picpath.glide37;

import

android.graphics.drawable.Drawable;

import

com.bumptech.glide.Glide;

import

com.bumptech.glide.request.animation.GlideAnimation;

import

com.bumptech.glide.request.target.Target;

public

abstract

class

ProgressTarget<T,

Z>

extends

WrappingTarget<Z>

implements

OkHttpProgressGlideModule.UIProgressListener

{

private

T

model;

private

boolean

ignoreProgress

=

true;

public

ProgressTarget(T

model,

Target<Z>

target)

{

super(target);

this.model

=

model;

}

public

final

T

getModel()

{

return

model;

}

public

final

void

setModel(T

model)

{

Glide.clear(this);

//

indirectly

calls

cleanup

this.model

=

model;

}

/**

*

Convert

a

model

into

an

Url

string

that

is

used

to

match

up

the

OkHttp

requests.

For

explicit

*

{@link

com.bumptech.glide.load.model.GlideUrl

GlideUrl}

loads

this

needs

to

return

*

{@link

com.bumptech.glide.load.model.GlideUrl#toStringUrl

toStringUrl}.

For

custom

models

do

the

same

as

your

*

{@link

com.bumptech.glide.load.model.stream.BaseGlideUrlLoader

BaseGlideUrlLoader}

does.

*

*

@param

model

return

the

representation

of

the

given

model,

DO

NOT

use

{@link

#getModel()}

inside

this

method.

*

@return

a

stable

Url

representation

of

the

model,

otherwise

the

progress

reporting

won't

work

*/

protected

String

toUrlString(T

model)

{

return

String.valueOf(model);

}

@Override

public

float

getGranualityPercentage()

{

return

1.0f;

}

private

void

start()

{

OkHttpProgressGlideModule.expect(toUrlString(model),

this);

ignoreProgress

=

false;

}

private

void

cleanup()

{

ignoreProgress

=

true;

T

model

=

this.model;

//

save

in

case

it

gets

modified

OkHttpProgressGlideModule.forget(toUrlString(model));

this.model

=

null;

}

@Override

public

void

onLoadStarted(Drawable

placeholder)

{

super.onLoadStarted(placeholder);

start();

}

@Override

public

void

onResourceReady(Z

resource,

GlideAnimation<?

super

Z>

animation)

{

cleanup();

super.onResourceReady(resource,

animation);

}

@Override

public

void

onLoadFailed(Exception

e,

Drawable

errorDrawable)

{

cleanup();

super.onLoadFailed(e,

errorDrawable);

}

@Override

public

void

onLoadCleared(Drawable

placeholder)

{

cleanup();

super.onLoadCleared(placeholder);

}

}

WrappingTarget:package

com.example.shining.p042_largep_w_picpath.glide37;

import

android.graphics.drawable.Drawable;

import

com.bumptech.glide.request.Request;

import

com.bumptech.glide.request.animation.GlideAnimation;

import

com.bumptech.glide.request.target.SizeReadyCallback;

import

com.bumptech.glide.request.target.Target;

public

class

WrappingTarget<Z>

implements

Target<Z>

{

protected

final

Target<Z>

target;

public

WrappingTarget(Target<Z>

target)

{

this.target

=

target;

}

@Override

public

void

getSize(SizeReadyCallback

cb)

{

if

(target

!=

null)

target.getSize(cb);

}

@Override

public

void

onLoadStarted(Drawable

placeholder)

{

if

(target

!=

null)

target.onLoadStarted(placeholder);

}

@Override

public

void

onLoadFailed(Exception

e,

Drawable

errorDrawable)

{

if

(target

!=

null)

target.onLoadFailed(e,

errorDrawable);

}

@Override

public

void

onResourceReady(Z

resource,

GlideAnimation<?

super

Z>

glideAnimation)

{

if

(target

!=

null)

target.onResourceReady(resource,

glideAnimation);

}

@Override

public

void

onLoadCleared(Drawable

placeholder)

{

if

(target

!=

null)

target.onLoadCleared(placeholder);

}

private

Request

request;

@Override

public

Request

getRequest()

{

return

request;

}

@Override

public

void

setRequest(Request

request)

{

this.request

=

request;

if

(target

!=

null)

target.setRequest(request);

}

@Override

public

void

onStart()

{

if

(target

!=

null)

target.onStart();

}

@Override

public

void

onStop()

{

if

(target

!=

null)

target.onStop();

}

@Override

public

void

onDestroy()

{

if

(target

!=

null)

target.onDestroy();

}

}

buildgradle://largep_w_picpath

compile

'com.shizhefei:LargeImageView:1.0.9'

compile

'com.github.HotBitmapGG:RingProgressBar:V1.2.2'

加載網(wǎng)絡圖片MainActivityLargeImageGlide:package

com.example.shining.p042_largep_w_picpath.activity;

import

android.graphics.Bitmap;

import

android.graphics.BitmapFactory;

import

android.graphics.drawable.Drawable;

import

android.os.Bundle;

import

android.support.v7.app.AppCompatActivity;

import

android.view.View;

import

com.bumptech.glide.Glide;

import

com.bumptech.glide.request.animation.GlideAnimation;

import

com.bumptech.glide.request.target.SizeReadyCallback;

import

com.bumptech.glide.request.target.Target;

import

com.example.shining.p042_largep_w_picpath.R;

import

com.example.shining.p042_largep_w_picpath.glide37.OkHttpProgressGlideModule;

import

com.example.shining.p042_largep_w_picpath.glide37.ProgressTarget;

import

com.shizhefei.view.largep_w_picpath.LargeImageView;

import

com.shizhefei.view.largep_w_picpath.factory.FileBitmapDecoderFactory;

import

java.io.File;

import

java.io.IOException;

import

java.io.InputStream;

import

.HttpURLConnection;

import

.MalformedURLException;

import

.URL;

import

open.hotbitmapgg.library.view.RingProgressBar;

public

class

MainActivityLargeImageGlide

extends

AppCompatActivity

{

private

LargeImageView

largeImageView;

private

RingProgressBar

ringProgressBar;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_large_p_w_picpath_view);

largeImageView

=

(LargeImageView)

findViewById(R.workDemo_photoView);

ringProgressBar

=

(RingProgressBar)

findViewById(R.workDemo_ringProgressBar);

//

String

url

=

"/uploads/msg/201703/20170309/1485/1489068660846.jpg";

//

URL

fileUrl

=

null;

//

File

file

=

null;

//

try

{

//

fileUrl

=

new

URL(url);

//

file

=

new

File(fileUrl.toURI());

//

}

catch

(MalformedURLException

|

URISyntaxException

e)

{

//

e.printStackTrace();

//

}

//

//

assert

file

!=

null;

//

largeImageView.setImage(new

FileBitmapDecoderFactory(file));

//

String

url

=

"/upload/information/20200311/46/179850.jpg";

//

String

url

=

"/wyfs02/M00/06/F4/wKiom1nA-Aiy9qMkAAR3_qzZ1is031.jpg";

String

url

=

"/upload/information/20200311/46/179849.jpg";

final

Glide

glide

=

Glide.get(this);

OkHttpProgressGlideModule

a

=

new

OkHttpProgressGlideModule();

a.registerComponents(this,

glide);

new

Thread()

{

@Override

public

void

run()

{

super.run();

Glide.get(getApplicationContext()).clearDiskCache();

runOnUiThread(new

Runnable()

{

@Override

public

void

run()

{

//

Toast.makeText(getApplicationContext(),

"清除緩存成功",

Toast.LENGTH_SHORT).show();

}

});

}

}.start();

Glide.with(this).load(url).downloadOnly(new

ProgressTarget<String,

File>(url,

null)

{

@Override

public

void

onLoadStarted(Drawable

placeholder)

{

super.onLoadStarted(placeholder);

ringProgressBar.setVisibility(View.VISIBLE);

ringProgressBar.setProgress(0);

}

@Override

public

void

onProgress(long

bytesRead,

long

expectedLength)

{

int

p

=

0;

if

(expectedLength

>=

0)

{

p

=

(int)

(100

*

bytesRead

/

expectedLength);

}

ringProgressBar.setProgress(p);

}

@Override

public

void

onResourceReady(File

resource,

GlideAnimation<?

super

File>

animation)

{

super.onResourceReady(resource,

animation);

ringProgressBar.setVisibility(View.GONE);

//

largeImageView.setEnabled(false);

largeImageView.setImage(new

FileBitmapDecoderFactory(resource));

}

@Override

public

void

getSize(SizeReadyCallback

cb)

{

cb.onSizeReady(Target.SIZE_ORIGINAL,

Target.SIZE_ORIGINAL);

}

});

}

/**

*

根據(jù)圖片的url路徑獲得Bitmap對象

*

*

@param

url

*

@return

*/

private

Bitmap

returnBitmap(String

url)

{

URL

fileUrl

=

null;

Bitmap

bitmap

=

null;

try

{

fileUrl

=

new

URL(url);

}

catch

(MalformedURLException

e)

{

e.printStackTrace();

}

try

{

HttpURLConnection

conn

=

(HttpURLConnection)

fileUrl.openConnection();

conn.setDoInput(true);

conn.connect();

InputStream

is

=

conn.getInputStream();

bitmap

=

BitmapFactory.decodeStream(is);

is.close();

}

catch

(IOException

e)

{

e.printStackTrace();

}

return

bitmap;

}

}

加載本地assets文件夾大圖,這里要說一下,經(jīng)過測試,手機取drawable里面的巨圖會OOM,平板不會,但是assets目錄手機和平板都支持,因為drawable取的是路徑加載,assets是文件流,所以不會OOM,

加載drawable目錄

MainActivityLargeImageLocal1:package

com.example.shining.p042_largep_w_picpath.activity;

import

android.os.Bundle;

import

android.support.v7.app.AppCompatActivity;

import

com.example.shining.p042_largep_w_picpath.R;

import

com.shizhefei.view.largep_w_picpath.LargeImageView;

public

class

MainActivityLargeImageLocal1

extends

AppCompatActivity

{

private

LargeImageView

localDemo_photoView;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main_largep_w_picpath_local);

localDemo_photoView

=

(LargeImageView)

findViewById(R.id.localDemo_photoView);

String

fileName

=

getIntent().getStringExtra("file_name");

localDemo_photoView.setImage(getResources().getDrawable(R.drawable.qm3));

runOnUiThread(new

Runnable()

{

@Override

public

void

run()

{

localDemo_photoView.setScale(0.5f);

}

});

}

}

加載assets目錄

MainActivityLargeImageLocal2:package

com.example.shining.p042_largep_w_picpath.activity;

import

android.os.Bundle;

import

android.support.v7.app.AppCompatActivity;

import

com.example.shining.p042_largep_w_picpath.R;

import

com.shizhefei.view.largep_w_picpath.BlockImageLoader;

import

com.shizhefei.view.largep_w_picpath.LargeImageView;

import

com.shizhefei.view.largep_w_picpath.factory.InputStreamBitmapDecoderFactory;

import

java.io.IOException;

import

java.io.InputStream;

public

class

MainActivityLargeImageLocal2

extends

AppCompatActivity

{

private

LargeImageView

largeImageView;

@Override

protected

void

onCreate(Bundle

savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main_largep_w_picpath_local);

largeImageView

=

(LargeImageView)

findViewById(R.id.localDemo_photoView);

try

{

String

fileName

=

getIntent().getStringExtra("file_name");

//通過文件的方式加載sd卡中的大圖

//

localDemo_photoView.setImage(new

FileBitmapDecoderFactory(file));

//通過流的方式加載assets文件夾里面的大圖

InputStream

inputStream

=

getAssets().open("qm.jpg");

largeImageView.setImage(new

InputStreamBitmapDecoderFactory(inputStream));

//

localDemo_photoView.setImage(new

InputStreamBitmapDecoderFactory(inputStream),

getResources().getDrawable(R.drawable.mvc));

runOnUiThread(new

Runnable()

{

@Override

public

void

run()

{

largeImageView.setScale(0.5f);

largeImageView.setOnImageLoadListener(new

BlockImageLoader.OnImageLoadListener()

{

@Override

public

void

onBlockImageLoadFinished()

{

}

@Override

public

void

onLoadImageSize(int

p_w_picpathWidth,

int

p_w_picpathHeight)

{

String

a

=

p_w_picpathHeight

+

"";

}

@Override

public

void

onLoadFail(Exception

e)

{

}

});

//

largeImageView.setCriticalScaleValueHook(new

LargeImageView.CriticalScaleValueHook()

{

//

@Override

//

public

float

getMinScale(LargeImageView

largeImageView,

int

p_w_picpathWidth,

int

p_w_picpathHeight,

float

suggestMinScale)

{

//

return

15;

//

}

//

//

@Override

//

public

float

getMaxScale(LargeImageView

largeImageView,

int

p_w_picpathWidth,

int

p_w_picpathHeight,

float

suggestMaxScale)

{

//

return

30;

//

}

//

});

}

});

}

catch

(IOException

e)

{

e.printStackTrace();

}

}

}

這里給你提供一下小細節(jié),大部分人在后臺返回色值或者UI設計0%透明度的時候煩惱,給大家記錄一下透明的計算方法:

<color

name="transparent_white">#00ffffff</color>

00這兩位的計算:255*50%(透明度UI會告訴你)=結果128轉化成16進制就是80這兩位你需要的。

colorUtil:<?xml

version="1.0"

encoding="utf-8"?>

<resources>

<color

name="colorPrimary">#3F51B5</color>

<color

name="colorPrimaryDark">#303F9F</color>

<color

name="colorAccent">#FF4081</color>

<color

name="gray_line">#dfdfdf</color>

<color

name="white">#ffffff</color>

<!--

白色

-->

<color

name="ivory">#fffff0</color>

<!--

象牙色

-->

<color

name="lightyellow">#ffffe0</color>

<!--

亮×××

-->

<color

name="yellow">#ffff00</color>

<!--

×××

-->

<color

name="snow">#fffafa</color>

<!--

雪白色

-->

<color

name="floralwhite">#fffaf0</color>

<!--

花白色

-->

<color

name="lemonchiffon">#fffacd</color>

<!--

檸檬綢色

-->

<color

name="cornsilk">#fff8dc</color>

<!--

米綢色

-->

<color

name="seaShell">#fff5ee</color>

<!--

海貝色

-->

<color

name="lavenderblush">#fff0f5</color>

<!--

淡紫紅

-->

<color

name="papayawhip">#ffefd5</color>

<!--

番木色

-->

<color

name="blanchedalmond">#ffebcd</color>

<!--

白杏色

-->

<color

name="mistyrose">#ffe4e1</color>

<!--

淺玫瑰色

-->

<color

name="bisque">#ffe4c4</color>

<!--

桔×××

-->

<color

name="moccasin">#ffe4b5</color>

<!--

鹿皮色

-->

<color

name="navajowhite">#ffdead</color>

<!--

納瓦白

-->

<color

name="peachpuff">#ffdab9</color>

<!--

桃色

-->

<color

name="gold">#ffd700</color>

<!--

金色

-->

<color

name="pink">#ffc0cb</color>

<!--

粉紅色

-->

<color

name="lightpink">#ffb6c1</color>

<!--

亮粉紅色

-->

<color

name="orange">#ffa500</color>

<!--

橙色

-->

<color

name="lightsalmon">#ffa07a</color>

<!--

亮肉色

-->

<color

name="darkorange">#ff8c00</color>

<!--

暗桔×××

-->

<color

name="coral">#ff7f50</color>

<!--

珊瑚色

-->

<color

name="hotpink">#ff69b4</color>

<!--

熱粉紅色

-->

<color

name="tomato">#ff6347</color>

<!--

西紅柿色

-->

<color

name="orangered">#ff4500</color>

<!--

紅橙色

-->

<color

name="deeppink">#ff1493</color>

<!--

深粉紅色

-->

<color

name="fuchsia">#ff00ff</color>

<!--

紫紅色

-->

<color

name="magenta">#ff00ff</color>

<!--

紅紫色

-->

<color

name="red">#ff0000</color>

<!--

紅色

-->

<color

name="oldlace">#fdf5e6</color>

<!--

老花色

-->

<color

name="lightgoldenrodyellow">#fafad2</color>

<!--

亮金×××

-->

<color

name="linen">#faf0e6</color>

<!--

亞麻色

-->

<color

name="ant

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論