版權說明:本文檔由用戶提供并上傳,收益歸屬內(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. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)業(yè)合作投資合同
- 交通事故賠償合同范本大全
- 個人家政服務勞務合同
- 喪葬禮儀服務合同模板
- 二手拖拉機買賣合同協(xié)議書范本
- 個人信用借款合同范文
- 個人汽車消費貸款合同
- 專職律師聘任合同示范文本
- 買賣合同司法解釋
- 專業(yè)顧問兼職合作合同
- 父母贈與協(xié)議書
- 駕照體檢表完整版本
- 簡易勞務合同電子版
- 明代文學緒論
- 通用稅務自查情況說明報告(7篇)
- 體育賽事的策劃、組織與實施 體育賽事利益相關者
- 分析化學(高職)PPT完整版全套教學課件
- 晚熟的人(莫言諾獎后首部作品)
- m拱頂儲罐設計計算書
- 2023外貿(mào)業(yè)務協(xié)調期中試卷
- 新人教鄂教版(2017)五年級下冊科學全冊教學課件
評論
0/150
提交評論