提交 968e844a 编写于 作者: B Blankj

see 06/11 log

上级 44bd2efd
......@@ -492,37 +492,40 @@ addView : 为SnackBar添加布局
dismiss : 取消snackbar显示
```
* ### SpannableString相关→[SpannableStringUtils.java][spannable.java][Demo][spannable.demo]
```
Builder.setFlag : 设置标识
Builder.setForegroundColor: 设置前景色
Builder.setBackgroundColor: 设置背景色
Builder.setQuoteColor : 设置引用线的颜色
Builder.setLeadingMargin : 设置缩进
Builder.setMargin : 设置间距
Builder.setBullet : 设置列表标记
Builder.setFontSize : 设置字体尺寸
Builder.setFontProportion : 设置字体比例
Builder.setFontXProportion: 设置字体横向比例
Builder.setStrikethrough : 设置删除线
Builder.setUnderline : 设置下划线
Builder.setSuperscript : 设置上标
Builder.setSubscript : 设置下标
Builder.setBold : 设置粗体
Builder.setItalic : 设置斜体
Builder.setBoldItalic : 设置粗斜体
Builder.setFontFamily : 设置字体系列
Builder.setTypeface : 设置字体
Builder.setAlign : 设置对齐
Builder.setBitmap : 设置图片
Builder.setDrawable : 设置图片
Builder.setUri : 设置图片
Builder.setResourceId : 设置图片
Builder.setClickSpan : 设置点击事件
Builder.setUrl : 设置超链接
Builder.setBlur : 设置模糊
Builder.append : 追加样式字符串
Builder.create : 创建样式字符串
* ### SpannableString相关→[SpanUtils.java][span.java][Demo][span.demo]
```
setFlag : 设置标识
setForegroundColor: 设置前景色
setBackgroundColor: 设置背景色
setLineHeight : 设置行高
setQuoteColor : 设置引用线的颜色
setLeadingMargin : 设置缩进
setBullet : 设置列表标记
setIconMargin : 设置图标
setFontSize : 设置字体尺寸
setFontProportion : 设置字体比例
setFontXProportion: 设置字体横向比例
setStrikethrough : 设置删除线
setUnderline : 设置下划线
setSuperscript : 设置上标
setSubscript : 设置下标
setBold : 设置粗体
setItalic : 设置斜体
setBoldItalic : 设置粗斜体
setFontFamily : 设置字体系列
setTypeface : 设置字体
setAlign : 设置对齐
setClickSpan : 设置点击事件
setUrl : 设置超链接
setBlur : 设置模糊
setShader : 设置着色器
setShadow : 设置阴影
setSpans : 设置样式
append : 追加样式字符串
appendLine : 追加一行样式字符串
appendImage : 追加图片
appendSpace : 追加空白
create : 创建样式字符串
```
* ### SP相关→[SPUtils.java][sp.java][Test][sp.test]
......@@ -610,14 +613,17 @@ getZodiac : 获取星座
* ### 吐司相关→[ToastUtils.java][toast.java][Demo][toast.demo]
```
setGravity : 设置吐司位置
setView : 设置吐司view
getView : 获取吐司view
showShortSafe: 安全地显示短时吐司
showLongSafe : 安全地显示长时吐司
showShort : 显示短时吐司
showLong : 显示长时吐司
cancel : 取消吐司显示
setGravity : 设置吐司位置
setView : 设置吐司view
getView : 获取吐司view
setBackgroundColor : 设置背景颜色
setBackgroundResource: 设置背景资源
setMessageColor : 设置消息颜色
showShortSafe : 安全地显示短时吐司
showLongSafe : 安全地显示长时吐司
showShort : 显示短时吐司
showLong : 显示长时吐司
cancel : 取消吐司显示
```
* ### 压缩相关→[ZipUtils.java][zip.java][Test][zip.test]
......@@ -789,8 +795,8 @@ Utils.init(context);
[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
[span.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpanUtils.java
[span.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java
[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
......
......@@ -492,37 +492,40 @@ addView
dismiss
```
* ### About SpannableString→[SpannableStringUtils.java][spannable.java][Demo][spannable.demo]
```
Builder.setFlag
Builder.setForegroundColor
Builder.setBackgroundColor
Builder.setQuoteColor
Builder.setLeadingMargin
Builder.setMargin
Builder.setBullet
Builder.setFontSize
Builder.setFontProportion
Builder.setFontXProportion
Builder.setStrikethrough
Builder.setUnderline
Builder.setSuperscript
Builder.setSubscript
Builder.setBold
Builder.setItalic
Builder.setBoldItalic
Builder.setFontFamily
Builder.setTypeface
Builder.setAlign
Builder.setBitmap
Builder.setDrawable
Builder.setUri
Builder.setResourceId
Builder.setClickSpan
Builder.setUrl
Builder.setBlur
Builder.append
Builder.create
* ### About Span→[SpanUtils.java][span.java][Demo][span.demo]
```
setFlag
setForegroundColor
setBackgroundColor
setLineHeight
setQuoteColor
setLeadingMargin
setBullet
setIconMargin
setFontSize
setFontProportion
setFontXProportion
setStrikethrough
setUnderline
setSuperscript
setSubscript
setBold
setItalic
setBoldItalic
setFontFamily
setTypeface
setAlign
setClickSpan
setUrl
setBlur
setShader
setShadow
setSpans
append
appendLine
appendImage
appendSpace
create
```
* ### About SP→[SPUtils.java][sp.java][Test][sp.test]
......@@ -613,6 +616,9 @@ getZodiac
setGravity
setView
getView
setBackgroundColor
setBackgroundResource
setMessageColor
showShortSafe
showLongSafe
showShort
......@@ -789,8 +795,8 @@ Utils.init(context);
[snackbar.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SnackbarUtils.java
[snackbar.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SnackbarActivity.java
[spannable.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpannableStringUtils.java
[spannable.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpannableActivity.java
[span.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SpanUtils.java
[span.demo]: https://github.com/Blankj/AndroidUtilCode/blob/master/app/src/main/java/com/blankj/androidutilcode/activity/SpanActivity.java
[sp.java]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/main/java/com/blankj/utilcode/util/SPUtils.java
[sp.test]: https://github.com/Blankj/AndroidUtilCode/blob/master/utilcode/src/test/java/com/blankj/utilcode/util/SPUtilsTest.java
......
......@@ -4,14 +4,14 @@ File signPropertiesFile = rootProject.file('sign/keystore.properties')
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
buildToolsVersion "25.0.3"
defaultConfig {
applicationId "com.blankj.androidutilcode"
minSdkVersion 15
targetSdkVersion 16
versionCode 36
versionName "1.6.4"
versionCode 40
versionName "1.7.0"
}
if (signPropertiesFile.exists()) {
......@@ -29,7 +29,6 @@ android {
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
......
......@@ -75,9 +75,8 @@
<activity android:name=".activity.ProcessActivity"/>
<activity android:name=".activity.SDCardActivity"/>
<activity android:name=".activity.SnackbarActivity"/>
<activity android:name=".activity.SpannableActivity"/>
<activity android:name=".activity.SpanActivity"/>
<activity android:name=".activity.ToastActivity"/>
<activity android:name=".activity.CacheActivity"/>
<service android:name=".service.LocationService"/>
......
......@@ -9,7 +9,7 @@ import com.blankj.androidutilcode.Config;
import com.blankj.androidutilcode.R;
import com.blankj.androidutilcode.base.BaseActivity;
import com.blankj.utilcode.util.AppUtils;
import com.blankj.utilcode.util.SpannableStringUtils;
import com.blankj.utilcode.util.SpanUtils;
import com.blankj.utilcode.util.ToastUtils;
/**
......@@ -42,14 +42,15 @@ public class AppActivity extends BaseActivity {
findViewById(R.id.btn_launch_app).setOnClickListener(this);
findViewById(R.id.btn_get_app_details_settings).setOnClickListener(this);
TextView tvAboutApp = (TextView) findViewById(R.id.tv_about_app);
tvAboutApp.setText(new SpannableStringUtils.Builder().append("app icon: ")
.appendLine("").setDrawable(AppUtils.getAppIcon(), SpannableStringUtils.ALIGN_CENTER)
.append(AppUtils.getAppInfo().toString())
.appendLine("isAppRoot: " + AppUtils.isAppRoot())
.appendLine("isAppDebug: " + AppUtils.isAppDebug())
.appendLine("AppSignatureSHA1: " + AppUtils.getAppSignatureSHA1())
.appendLine("isAppForeground: " + AppUtils.isAppForeground())
.create());
tvAboutApp.setText(
new SpanUtils()
.append("app icon: ").appendImage(AppUtils.getAppIcon(), SpanUtils.ALIGN_CENTER)
.appendLine(AppUtils.getAppInfo().toString())
.appendLine("isAppRoot: " + AppUtils.isAppRoot())
.appendLine("isAppDebug: " + AppUtils.isAppDebug())
.appendLine("AppSignatureSHA1: " + AppUtils.getAppSignatureSHA1())
.appendLine("isAppForeground: " + AppUtils.isAppForeground())
.create());
}
@Override
......
......@@ -50,8 +50,8 @@ public class ImageActivity extends BaseActivity {
ImageView ivAddImageWatermark = (ImageView) findViewById(R.id.iv_add_image_watermark);
ImageView ivGray = (ImageView) findViewById(R.id.iv_gray);
Bitmap src = ImageUtils.getBitmap(getResources(), R.drawable.lena);
Bitmap watermark = ImageUtils.getBitmap(getResources(), R.mipmap.ic_launcher);
Bitmap src = ImageUtils.getBitmap(R.drawable.lena);
Bitmap watermark = ImageUtils.getBitmap(R.mipmap.ic_launcher);
SizeUtils.forceGetViewSize(ivSrc, new SizeUtils.onGetSizeListener() {
@Override
......@@ -63,7 +63,7 @@ public class ImageActivity extends BaseActivity {
ivRoundCorner.setImageBitmap(ImageUtils.toRoundCorner(src, 60));
ivFastBlur.setImageBitmap(ImageUtils.fastBlur(src, 0.1f, 5));
ivRenderScriptBlur.setImageBitmap(ImageUtils.renderScriptBlur(src, 10));
src = ImageUtils.getBitmap(getResources(), R.drawable.lena);
src = ImageUtils.getBitmap(R.drawable.lena);
ivStackBlur.setImageBitmap(ImageUtils.stackBlur(src, 10, false));
ivAddFrame.setImageBitmap(ImageUtils.addFrame(src, 16, Color.GREEN));
ivAddReflection.setImageBitmap(ImageUtils.addReflection(src, 80));
......
......@@ -129,7 +129,7 @@ public class MainActivity extends BaseActivity {
}
public void spannableClick(View view) {
startActivity(new Intent(this, SpannableActivity.class));
startActivity(new Intent(this, SpanActivity.class));
}
public void toastClick(View view) {
......
......@@ -8,7 +8,7 @@ import android.view.View;
import com.blankj.androidutilcode.R;
import com.blankj.androidutilcode.base.BaseActivity;
import com.blankj.utilcode.util.SnackbarUtils;
import com.blankj.utilcode.util.SpannableStringUtils;
import com.blankj.utilcode.util.SpanUtils;
import com.blankj.utilcode.util.ToastUtils;
/**
......@@ -22,14 +22,14 @@ import com.blankj.utilcode.util.ToastUtils;
public class SnackbarActivity extends BaseActivity {
private View snackBarRootView;
private final int TYPE_SHORT = 0x00;
private final int TYPE_SHORT_WITH_ACTION = 0x01;
private final int TYPE_LONG = 0x10;
private final int TYPE_LONG_WITH_ACTION = 0x11;
private final int TYPE_INDEFINITE = 0x20;
private final int TYPE_SHORT = 0x00;
private final int TYPE_SHORT_WITH_ACTION = 0x01;
private final int TYPE_LONG = 0x10;
private final int TYPE_LONG_WITH_ACTION = 0x11;
private final int TYPE_INDEFINITE = 0x20;
private final int TYPE_INDEFINITE_WITH_ACTION = 0x21;
private final int TYPE_CUSTOM = 0x40;
private final int TYPE_CUSTOM_WITH_ACTION = 0x41;
private final int TYPE_CUSTOM = 0x40;
private final int TYPE_CUSTOM_WITH_ACTION = 0x41;
@Override
public void initData(Bundle bundle) {
......@@ -94,9 +94,9 @@ public class SnackbarActivity extends BaseActivity {
}
private void showSnackbar(int type) {
SpannableStringUtils.Builder builder = new SpannableStringUtils.Builder()
.append("").setResourceId(R.mipmap.ic_launcher)
.append("").setMargin(24);
SpanUtils builder = new SpanUtils()
.append("").appendImage(R.mipmap.ic_launcher, SpanUtils.ALIGN_CENTER)
.append("").appendSpace(100);
switch (type) {
case TYPE_SHORT:
SnackbarUtils.showShort(snackBarRootView,
......@@ -147,8 +147,8 @@ public class SnackbarActivity extends BaseActivity {
SnackbarUtils.showShort(snackBarRootView,
"",
Color.BLUE,
Color.LTGRAY);
SnackbarUtils.addView(R.layout.snackbar_add, 0);
Color.TRANSPARENT);
SnackbarUtils.addView(R.layout.snackbar_custom, 1);
break;
case TYPE_CUSTOM_WITH_ACTION:
SnackbarUtils.showShort(snackBarRootView,
......@@ -162,7 +162,7 @@ public class SnackbarActivity extends BaseActivity {
ToastUtils.showShort(getString(R.string.snackbar_click));
}
});
SnackbarUtils.addView(R.layout.snackbar_add, 0);
SnackbarUtils.addView(R.layout.snackbar_custom, 0);
break;
}
......
package com.blankj.androidutilcode.activity;
import android.animation.ValueAnimator;
import android.content.Context;
import android.graphics.BitmapShader;
import android.graphics.BlurMaskFilter;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Matrix;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Layout;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.view.animation.LinearInterpolator;
import android.widget.TextView;
import com.blankj.androidutilcode.R;
import com.blankj.androidutilcode.base.BaseActivity;
import com.blankj.androidutilcode.span.BlurMaskFilterSpan;
import com.blankj.androidutilcode.span.ForegroundAlphaColorSpan;
import com.blankj.androidutilcode.span.ForegroundAlphaColorSpanGroup;
import com.blankj.androidutilcode.span.ShadowSpan;
import com.blankj.utilcode.util.ImageUtils;
import com.blankj.utilcode.util.SpanUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.blankj.utilcode.util.Utils;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/09/27
* desc : Span工具类Demo
* </pre>
*/
public class SpanActivity extends BaseActivity {
SpanUtils mSpanUtils;
SpannableStringBuilder animSsb;
int lineHeight;
float textSize;
ValueAnimator valueAnimator;
Shader mShader;
float mShaderWidth;
Matrix matrix;
BlurMaskFilterSpan mBlurMaskFilterSpan;
ShadowSpan mShadowSpan;
ForegroundAlphaColorSpan mForegroundAlphaColorSpan;
ForegroundAlphaColorSpanGroup mForegroundAlphaColorSpanGroup;
String mPrinterString;
float density;
TextView tvAboutSpan;
TextView tvAboutAnimRainbow;
TextView tvAboutAnimBlur;
@Override
public void initData(Bundle bundle) {
}
@Override
public int bindLayout() {
return R.layout.activity_span;
}
@Override
public void initView(Bundle savedInstanceState, View view) {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
ToastUtils.showShort("事件触发了");
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
};
tvAboutSpan = (TextView) findViewById(R.id.tv_about_span);
tvAboutAnimRainbow = (TextView) findViewById(R.id.tv_about_anim_span);
// 响应点击事件的话必须设置以下属性
tvAboutSpan.setMovementMethod(LinkMovementMethod.getInstance());
lineHeight = tvAboutSpan.getLineHeight();
textSize = tvAboutSpan.getTextSize();
density = Utils.getContext().getResources().getDisplayMetrics().density;
tvAboutSpan.setText(new SpanUtils()
.appendLine("SpanUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setAlign(Layout.Alignment.ALIGN_CENTER)
.appendLine("前景色").setForegroundColor(Color.GREEN)
.appendLine("背景色").setBackgroundColor(Color.LTGRAY)
.appendLine("行高顶部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.GREEN)
.appendLine("行高居中对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
.appendLine("行高底部对齐").setLineHeight(2 * lineHeight, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
.appendLine("测试段落缩,首行缩进两字,其他行不缩进").setLeadingMargin((int) textSize * 2, 10).setBackgroundColor(Color.GREEN)
.appendLine("测试引用,后面的字是为了凑到两行的效果").setQuoteColor(Color.GREEN, 10, 10).setBackgroundColor(Color.LTGRAY)
.appendLine("测试列表项,后面的字是为了凑到两行的效果").setBullet(Color.GREEN, 20, 10).setBackgroundColor(Color.LTGRAY).setBackgroundColor(Color.GREEN)
.appendLine("测试图标文字顶部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.LTGRAY)
.appendLine("测试图标文字居中对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.GREEN)
.appendLine("测试图标文字底部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_high, 20, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.LTGRAY)
.appendLine("测试图标顶部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_TOP).setBackgroundColor(Color.GREEN)
.appendLine("测试图标居中对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_CENTER).setBackgroundColor(Color.LTGRAY)
.appendLine("测试图标底部对齐,后面的字是为了凑到两行的效果").setIconMargin(R.drawable.shape_spannable_block_low, 20, SpanUtils.ALIGN_BOTTOM).setBackgroundColor(Color.GREEN)
.appendLine("32dp字体").setFontSize(32, true)
.appendLine("2倍字体").setFontProportion(2)
.appendLine("横向2倍字体").setFontXProportion(1.5f)
.appendLine("删除线").setStrikethrough()
.appendLine("下划线").setUnderline()
.append("测试").appendLine("上标").setSuperscript()
.append("测试").appendLine("下标").setSubscript()
.appendLine("粗体").setBold()
.appendLine("斜体").setItalic()
.appendLine("粗斜体").setBoldItalic()
.appendLine("monospace字体").setFontFamily("monospace")
.appendLine("自定义字体").setTypeface(Typeface.createFromAsset(getAssets(), "fonts/dnmbhs.ttf"))
.appendLine("相反对齐").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
.appendLine("居中对齐").setAlign(Layout.Alignment.ALIGN_CENTER)
.appendLine("正常对齐").setAlign(Layout.Alignment.ALIGN_NORMAL)
.append("测试").appendLine("点击事件").setClickSpan(clickableSpan)
.append("测试").appendLine("Url").setUrl("https://github.com/Blankj/AndroidUtilCode")
.append("测试").appendLine("模糊").setBlur(3, BlurMaskFilter.Blur.NORMAL)
.appendLine("颜色渐变").setShader(new LinearGradient(0, 0,
64 * density * 4, 0,
getResources().getIntArray(R.array.rainbow),
null,
Shader.TileMode.REPEAT)).setFontSize(64, true)
.appendLine("图片着色").setFontSize(64, true).setShader(new BitmapShader(ImageUtils.getBitmap(R.drawable.cheetah),
Shader.TileMode.REPEAT,
Shader.TileMode.REPEAT))
.appendLine("阴影效果").setFontSize(64, true).setBackgroundColor(Color.BLACK).setShadow(24, 8, 8, Color.WHITE)
.append("测试小图对齐").setBackgroundColor(Color.LTGRAY)
.appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_TOP)
.appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_CENTER)
.appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BASELINE)
.appendImage(R.drawable.shape_spannable_block_low, SpanUtils.ALIGN_BOTTOM)
.appendLine("end").setBackgroundColor(Color.LTGRAY)
.append("测试大图字体顶部对齐").setBackgroundColor(Color.GREEN)
.appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_TOP)
.appendLine()
.append("测试大图字体居中对齐").setBackgroundColor(Color.LTGRAY)
.appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_CENTER)
.appendLine()
.append("测试大图字体底部对齐").setBackgroundColor(Color.GREEN)
.appendImage(R.drawable.shape_spannable_block_high, SpanUtils.ALIGN_BOTTOM)
.appendLine()
.append("测试空格").appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN).appendSpace(100).appendSpace(30, Color.LTGRAY).appendSpace(50, Color.GREEN)
.create());
initAnimSpan();
startAnim();
}
private void initAnimSpan() {
mShaderWidth = 64 * density * 4;
mShader = new LinearGradient(0, 0,
mShaderWidth, 0,
getResources().getIntArray(R.array.rainbow),
null,
Shader.TileMode.REPEAT);
matrix = new Matrix();
mBlurMaskFilterSpan = new BlurMaskFilterSpan(25);
mShadowSpan = new ShadowSpan(8, 8, 8, Color.WHITE);
mForegroundAlphaColorSpan = new ForegroundAlphaColorSpan(Color.TRANSPARENT);
mForegroundAlphaColorSpanGroup = new ForegroundAlphaColorSpanGroup(0);
mPrinterString = "打印动画,后面的文字是为了测试打印效果...";
mSpanUtils = new SpanUtils()
.appendLine("彩虹动画").setFontSize(64, true).setShader(mShader)
.appendLine("模糊动画").setFontSize(64, true).setSpans(mBlurMaskFilterSpan)
.appendLine("阴影动画").setFontSize(64, true).setBackgroundColor(Color.BLACK).setSpans(mShadowSpan)
.appendLine("透明动画").setFontSize(64, true).setSpans(mForegroundAlphaColorSpan);
for (int i = 0, len = mPrinterString.length(); i < len; ++i) {
ForegroundAlphaColorSpan span = new ForegroundAlphaColorSpan(Color.TRANSPARENT);
mSpanUtils.append(mPrinterString.substring(i, i + 1)).setSpans(span);
mForegroundAlphaColorSpanGroup.addSpan(span);
}
animSsb = mSpanUtils.create();
}
private void startAnim() {
valueAnimator = ValueAnimator.ofFloat(0, 1);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
// shader
matrix.reset();
matrix.setTranslate((Float) animation.getAnimatedValue() * mShaderWidth, 0);
mShader.setLocalMatrix(matrix);
// blur
mBlurMaskFilterSpan.setRadius(25 * (1.00001f - (Float) animation.getAnimatedValue()));
// shadow
mShadowSpan.setDx(16 * (0.5f - (Float) animation.getAnimatedValue()));
mShadowSpan.setDy(16 * (0.5f - (Float) animation.getAnimatedValue()));
// alpha
mForegroundAlphaColorSpan.setAlpha((int) (255 * (Float) animation.getAnimatedValue()));
// printer
mForegroundAlphaColorSpanGroup.setAlpha((Float) animation.getAnimatedValue());
// update
tvAboutAnimRainbow.setText(animSsb);
}
});
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.setDuration(600 * 3);
valueAnimator.setRepeatCount(ValueAnimator.INFINITE);
valueAnimator.start();
}
@Override
public void doBusiness(Context context) {
}
@Override
public void onWidgetClick(View view) {
}
@Override
protected void onDestroy() {
valueAnimator.cancel();
super.onDestroy();
}
}
package com.blankj.androidutilcode.activity;
import android.content.Context;
import android.graphics.BlurMaskFilter;
import android.graphics.Color;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Layout;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView;
import com.blankj.androidutilcode.R;
import com.blankj.androidutilcode.base.BaseActivity;
import com.blankj.utilcode.util.SpannableStringUtils;
import com.blankj.utilcode.util.ToastUtils;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2016/09/27
* desc : SpannableString工具类Demo
* </pre>
*/
public class SpannableActivity extends BaseActivity {
@Override
public void initData(Bundle bundle) {
}
@Override
public int bindLayout() {
return R.layout.activity_spannable;
}
@Override
public void initView(Bundle savedInstanceState, View view) {
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
ToastUtils.showShort("事件触发了");
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.BLUE);
ds.setUnderlineText(false);
}
};
TextView tvAboutSpannable = (TextView) findViewById(R.id.tv_about_spannable);
// 响应点击事件的话必须设置以下属性
tvAboutSpannable.setMovementMethod(LinkMovementMethod.getInstance());
tvAboutSpannable.setText(new SpannableStringUtils.Builder()
.appendLine("测试SpannableStringUtils").setBackgroundColor(Color.LTGRAY).setBold().setForegroundColor(Color.YELLOW).setAlign(Layout.Alignment.ALIGN_CENTER)
.append("测试")
.append("前景色").setForegroundColor(Color.GREEN)
.appendLine("背景色").setBackgroundColor(Color.LTGRAY)
.appendLine("测试首行缩进").setLeadingMargin(30, 50)
.appendLine("测试引用").setQuoteColor(Color.BLUE, 10, 10)
.appendLine("测试列表项").setBullet(Color.GREEN, 30, 10)
.appendLine("测试32dp字体").setFontSize(36, true)
.append("测试")
.appendLine("2倍字体").setFontProportion(2)
.append("测试")
.appendLine("横向2倍字体").setFontXProportion(2)
.append("测试")
.append("删除线").setStrikethrough()
.appendLine("下划线").setUnderline()
.append("测试")
.append("上标").setSuperscript()
.appendLine("下标").setSubscript()
.append("测试")
.append("粗体").setBold()
.append("斜体").setItalic()
.appendLine("粗斜体").setBoldItalic()
.appendLine("monospace font").setFontFamily("monospace")
.appendLine("测试自定义字体").setTypeface(Typeface.createFromAsset(getAssets(), "fonts/dnmbhs.ttf"))
.appendLine("测试相反对齐").setAlign(Layout.Alignment.ALIGN_OPPOSITE)
.appendLine("测试居中对齐").setAlign(Layout.Alignment.ALIGN_CENTER)
.appendLine("测试正常对齐").setAlign(Layout.Alignment.ALIGN_NORMAL)
.append("测试小图对齐").setBackgroundColor(Color.LTGRAY)
.append("").setResourceId(R.drawable.shape_spannable_block_low, SpannableStringUtils.ALIGN_TOP)
.append("").setResourceId(R.drawable.shape_spannable_block_low, SpannableStringUtils.ALIGN_CENTER)
.append("").setResourceId(R.drawable.shape_spannable_block_low, SpannableStringUtils.ALIGN_BASELINE)
.append("").setResourceId(R.drawable.shape_spannable_block_low, SpannableStringUtils.ALIGN_BOTTOM)
.appendLine("end").setBackgroundColor(Color.LTGRAY)
.append("测试顶部对齐").setBackgroundColor(Color.GREEN)
.append("image").setResourceId(R.drawable.shape_spannable_block_high, SpannableStringUtils.ALIGN_TOP)
.appendLine("end").setBackgroundColor(Color.GREEN)
.append("居中对齐").setBackgroundColor(Color.LTGRAY)
.append("").setResourceId(R.drawable.shape_spannable_block_high, SpannableStringUtils.ALIGN_CENTER)
.appendLine("end").setBackgroundColor(Color.LTGRAY)
.append("Baseline对齐").setBackgroundColor(Color.GREEN)
.append("").setResourceId(R.drawable.shape_spannable_block_high, SpannableStringUtils.ALIGN_BASELINE)
.appendLine("end").setBackgroundColor(Color.GREEN)
.append("底部对齐").setBackgroundColor(Color.LTGRAY)
.append("").setResourceId(R.drawable.shape_spannable_block_high, SpannableStringUtils.ALIGN_BOTTOM)
.appendLine("end").setBackgroundColor(Color.LTGRAY)
.append("测试")
.appendLine("点击事件").setClickSpan(clickableSpan)
.append("测试")
.appendLine("Url").setUrl("https://github.com/Blankj/AndroidUtilCode")
.append("测试")
.append("模糊").setBlur(3, BlurMaskFilter.Blur.NORMAL)
.create()
);
}
@Override
public void doBusiness(Context context) {
}
@Override
public void onWidgetClick(View view) {
}
}
......@@ -20,8 +20,8 @@ import com.blankj.utilcode.util.ToastUtils;
*/
public class ToastActivity extends BaseActivity {
private boolean isDefaultLocation;
private boolean isDefaultView;
private boolean isDefaultLocation;
private boolean isDefaultView;
private TextView tvAboutToast;
@Override
......@@ -108,6 +108,7 @@ public class ToastActivity extends BaseActivity {
@Override
protected void onDestroy() {
ToastUtils.setView(null);
ToastUtils.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, getResources().getDimensionPixelSize(R.dimen.offset_64));
super.onDestroy();
}
}
package com.blankj.androidutilcode.span;
import android.graphics.BlurMaskFilter;
import android.graphics.MaskFilter;
import android.text.TextPaint;
import android.text.style.CharacterStyle;
import android.text.style.UpdateAppearance;
public class BlurMaskFilterSpan extends CharacterStyle implements UpdateAppearance {
private static final String TAG = "MutableBlurMaskFilterSpan";
private float mRadius;
private MaskFilter mFilter;
public BlurMaskFilterSpan(float radius) {
mRadius = radius;
}
public void setRadius(float radius) {
mRadius = radius;
mFilter = new BlurMaskFilter(mRadius, BlurMaskFilter.Blur.NORMAL);
}
public float getRadius() {
return mRadius;
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setMaskFilter(mFilter);
}
}
\ No newline at end of file
package com.blankj.androidutilcode.span;
import android.graphics.Color;
import android.support.annotation.ColorInt;
import android.text.TextPaint;
import android.text.style.CharacterStyle;
import android.text.style.UpdateAppearance;
public class ForegroundAlphaColorSpan extends CharacterStyle
implements UpdateAppearance {
private int mColor;
public ForegroundAlphaColorSpan(@ColorInt int color) {
mColor = color;
}
public void setAlpha(int alpha) {
mColor = Color.argb(alpha, Color.red(mColor), Color.green(mColor), Color.blue(mColor));
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(mColor);
}
}
package com.blankj.androidutilcode.span;
import java.util.ArrayList;
/**
* <pre>
* author: Blankj
* blog : http://blankj.com
* time : 2017/06/11
* desc :
* </pre>
*/
public class ForegroundAlphaColorSpanGroup {
private final float mAlpha;
private final ArrayList<ForegroundAlphaColorSpan> mSpans;
public ForegroundAlphaColorSpanGroup(float alpha) {
mAlpha = alpha;
mSpans = new ArrayList<>();
}
public void addSpan(ForegroundAlphaColorSpan span) {
span.setAlpha((int) (mAlpha * 255));
mSpans.add(span);
}
public void setAlpha(float alpha) {
int size = mSpans.size();
float total = 1.0f * size * alpha;
for (int index = 0; index < size; index++) {
ForegroundAlphaColorSpan span = mSpans.get(index);
if (total >= 1.0f) {
span.setAlpha(255);
total -= 1.0f;
} else {
span.setAlpha((int) (total * 255));
total = 0.0f;
}
}
}
public float getAlpha() {
return mAlpha;
}
}
package com.blankj.androidutilcode.span;
import android.text.TextPaint;
import android.text.style.CharacterStyle;
import android.text.style.UpdateAppearance;
public class ShadowSpan extends CharacterStyle implements UpdateAppearance {
private float radius;
private float dx;
private float dy;
private int shadowColor;
public ShadowSpan(float radius, float dx, float dy, int shadowColor) {
this.radius = radius;
this.dx = dx;
this.dy = dy;
this.shadowColor = shadowColor;
}
public float getDx() {
return dx;
}
public void setDx(float dx) {
this.dx = dx;
}
public float getDy() {
return dy;
}
public void setDy(float dy) {
this.dy = dy;
}
@Override
public void updateDrawState(TextPaint tp) {
tp.setShadowLayer(radius, dx, dy, shadowColor);
}
}
\ No newline at end of file
......@@ -12,7 +12,14 @@
android:padding="@dimen/spacing_16">
<TextView
android:id="@+id/tv_about_spannable"
android:id="@+id/tv_about_anim_span"
style="@style/TextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layerType="software"/>
<TextView
android:id="@+id/tv_about_span"
style="@style/TextStyle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
......
<?xml version="1.0" encoding="utf-8"?>
<ImageView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@mipmap/ic_launcher"/>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/shape_toast_bg"
android:background="@drawable/shape_round_rect"
android:drawableLeft="@mipmap/ic_launcher"
android:drawablePadding="@dimen/spacing_16"
android:gravity="center"
......
......@@ -4,7 +4,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:background="@drawable/shape_toast_bg"
android:background="@drawable/shape_round_rect"
android:drawableLeft="@mipmap/ic_launcher"
android:drawablePadding="@dimen/spacing_16"
android:gravity="center"
......
......@@ -6,4 +6,18 @@
<color name="white">#FFFFFF</color>
<color name="black">#000000</color>
<color name="rainbow_red">#bf0c43</color>
<color name="rainbow_yellow">#f9ba15</color>
<color name="rainbow_green">#8eac00</color>
<color name="rainbow_blue">#127a97</color>
<color name="rainbow_purple">#452b72</color>
<integer-array name="rainbow">
<item>@color/rainbow_red</item>
<item>@color/rainbow_yellow</item>
<item>@color/rainbow_green</item>
<item>@color/rainbow_blue</item>
<item>@color/rainbow_purple</item>
</integer-array>
</resources>
......@@ -6,7 +6,7 @@
<dimen name="block_low_width">40dp</dimen>
<dimen name="block_low_height">8dp</dimen>
<dimen name="block_high_width">20dp</dimen>
<dimen name="block_high_height">60dp</dimen>
<dimen name="block_high_height">96dp</dimen>
<dimen name="offset_64">64dp</dimen>
</resources>
* 17/06/11 SpanUtils完工,发布版本1.7.0
* 17/06/08 SpanUtils即将完工
* 17/06/07 SpannableStringUtils改名为SpanUtils,即将完工
* 17/06/06 优化SpannableStringUtils
......
......@@ -22,18 +22,17 @@ task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest', 'crea
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
buildToolsVersion "25.0.3"
defaultConfig {
minSdkVersion 15
versionCode 36
versionName "1.6.4"
versionCode 40
versionName "1.7.0"
}
buildTypes {
debug {
testCoverageEnabled true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
release {
......
......@@ -3,6 +3,7 @@ package com.blankj.utilcode.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Parcel;
......@@ -146,7 +147,7 @@ public class CacheUtils {
}
///////////////////////////////////////////////////////////////////////////
// byte 读写
// bytes 读写
///////////////////////////////////////////////////////////////////////////
/**
......@@ -916,22 +917,23 @@ public class CacheUtils {
}
private static Drawable bytes2Drawable(byte[] bytes) {
return bytes == null ? null : Bitmap2Drawable(bytes2Bitmap(bytes));
return bytes == null ? null : bitmap2Drawable(bytes2Bitmap(bytes));
}
private static Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable == null) return null;
if (drawable instanceof BitmapDrawable) {
BitmapDrawable BitmapDrawable = (BitmapDrawable) drawable;
if (BitmapDrawable.getBitmap() != null) {
return BitmapDrawable.getBitmap();
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap;
if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
bitmap = Bitmap.createBitmap(1, 1,
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
......@@ -939,8 +941,8 @@ public class CacheUtils {
return bitmap;
}
private static Drawable Bitmap2Drawable(Bitmap Bitmap) {
return Bitmap == null ? null : new BitmapDrawable(Utils.getContext().getResources(), Bitmap);
private static Drawable bitmap2Drawable(Bitmap bitmap) {
return bitmap == null ? null : new BitmapDrawable(Utils.getContext().getResources(), bitmap);
}
}
......
......@@ -5,6 +5,7 @@ import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.View;
......@@ -486,15 +487,17 @@ public final class ConvertUtils {
public static Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if(bitmapDrawable.getBitmap() != null) {
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap;
if(drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888);
if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1,
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
......
......@@ -30,17 +30,18 @@ public final class FragmentUtils {
throw new UnsupportedOperationException("u can't instantiate me...");
}
private static final int TYPE_ADD_FRAGMENT = 0x01;
private static final int TYPE_REMOVE_FRAGMENT = 0x01 << 1;
private static final int TYPE_REMOVE_TO_FRAGMENT = 0x01 << 2;
private static final int TYPE_REPLACE_FRAGMENT = 0x01 << 3;
private static final int TYPE_POP_ADD_FRAGMENT = 0x01 << 4;
private static final int TYPE_HIDE_FRAGMENT = 0x01 << 5;
private static final int TYPE_SHOW_FRAGMENT = 0x01 << 6;
private static final int TYPE_HIDE_SHOW_FRAGMENT = 0x01 << 7;
private static final String ARGS_ID = "args_id";
private static final String ARGS_IS_HIDE = "args_is_hide";
private static final int TYPE_ADD_FRAGMENT = 0x01;
private static final int TYPE_HIDE_ADD_FRAGMENT = 0x01 << 1;
private static final int TYPE_REMOVE_FRAGMENT = 0x01 << 2;
private static final int TYPE_REMOVE_TO_FRAGMENT = 0x01 << 3;
private static final int TYPE_REPLACE_FRAGMENT = 0x01 << 4;
private static final int TYPE_POP_ADD_FRAGMENT = 0x01 << 5;
private static final int TYPE_HIDE_FRAGMENT = 0x01 << 6;
private static final int TYPE_SHOW_FRAGMENT = 0x01 << 7;
private static final int TYPE_HIDE_SHOW_FRAGMENT = 0x01 << 8;
private static final String ARGS_ID = "args_id";
private static final String ARGS_IS_HIDE = "args_is_hide";
private static final String ARGS_IS_ADD_STACK = "args_is_add_stack";
/**
......@@ -131,7 +132,7 @@ public final class FragmentUtils {
boolean isAddStack,
SharedElement... sharedElement) {
putArgs(addFragment, new Args(containerId, isHide, isAddStack));
return operateFragment(fragmentManager, hideFragment, addFragment, TYPE_ADD_FRAGMENT, sharedElement);
return operateFragment(fragmentManager, hideFragment, addFragment, TYPE_HIDE_ADD_FRAGMENT, sharedElement);
}
/**
......@@ -522,11 +523,17 @@ public final class FragmentUtils {
}
}
switch (type) {
case TYPE_HIDE_ADD_FRAGMENT:
ft.hide(srcFragment);
case TYPE_ADD_FRAGMENT:
if (srcFragment != null) ft.hide(srcFragment);
ft.add(args.getInt(ARGS_ID), destFragment, name);
if (args.getBoolean(ARGS_IS_HIDE)) ft.hide(destFragment);
if (args.getBoolean(ARGS_IS_ADD_STACK)) ft.addToBackStack(name);
Fragment fragmentByTag = fragmentManager.findFragmentByTag(name);
if (fragmentByTag != null) {
destFragment = fragmentByTag;
} else {
ft.add(args.getInt(ARGS_ID), destFragment, name);
if (args.getBoolean(ARGS_IS_HIDE)) ft.hide(destFragment);
if (args.getBoolean(ARGS_IS_ADD_STACK)) ft.addToBackStack(name);
}
break;
case TYPE_REMOVE_FRAGMENT:
ft.remove(destFragment);
......@@ -872,7 +879,7 @@ public final class FragmentUtils {
}
static class Args {
int id;
int id;
boolean isHide;
boolean isAddStack;
......@@ -884,7 +891,7 @@ public final class FragmentUtils {
}
public static class SharedElement {
View sharedElement;
View sharedElement;
String name;
public SharedElement(View sharedElement, String name) {
......@@ -894,7 +901,7 @@ public final class FragmentUtils {
}
static class FragmentNode {
Fragment fragment;
Fragment fragment;
List<FragmentNode> next;
public FragmentNode(Fragment fragment, List<FragmentNode> next) {
......
package com.blankj.utilcode.util;
import android.annotation.TargetApi;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
......@@ -21,7 +20,6 @@ import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.media.ExifInterface;
import android.os.Build;
import android.renderscript.Allocation;
......@@ -90,30 +88,33 @@ public final class ImageUtils {
*/
public static Bitmap drawable2Bitmap(Drawable drawable) {
if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
} else if (drawable instanceof NinePatchDrawable) {
Bitmap bitmap = Bitmap.createBitmap(
drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(),
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
if (bitmapDrawable.getBitmap() != null) {
return bitmapDrawable.getBitmap();
}
}
Bitmap bitmap;
if (drawable.getIntrinsicWidth() <= 0 || drawable.getIntrinsicHeight() <= 0) {
bitmap = Bitmap.createBitmap(1, 1,
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
drawable.draw(canvas);
return bitmap;
} else {
return null;
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(),
drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
}
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
/**
* bitmap转drawable
*
* @param res resources对象
* @param bitmap bitmap对象
* @return drawable
*/
public static Drawable bitmap2Drawable(Resources res, Bitmap bitmap) {
return bitmap == null ? null : new BitmapDrawable(res, bitmap);
public static Drawable bitmap2Drawable(Bitmap bitmap) {
return bitmap == null ? null : new BitmapDrawable(Utils.getContext().getResources(), bitmap);
}
/**
......@@ -130,12 +131,11 @@ public final class ImageUtils {
/**
* byteArr转drawable
*
* @param res resources对象
* @param bytes 字节数组
* @return drawable
*/
public static Drawable bytes2Drawable(Resources res, byte[] bytes) {
return res == null ? null : bitmap2Drawable(res, bytes2Bitmap(bytes));
public static Drawable bytes2Drawable(byte[] bytes) {
return bitmap2Drawable(bytes2Bitmap(bytes));
}
/**
......@@ -171,7 +171,7 @@ public final class ImageUtils {
int height = options.outHeight;
int width = options.outWidth;
int inSampleSize = 1;
while ((height >>= 1) >= maxHeight && (width >>= 1) >= maxWidth) {
while ((height >>= 1) > maxHeight && (width >>= 1) > maxWidth) {
inSampleSize <<= 1;
}
return inSampleSize;
......@@ -316,32 +316,28 @@ public final class ImageUtils {
/**
* 获取bitmap
*
* @param res 资源对象
* @param id 资源id
* @param id 资源id
* @return bitmap
*/
public static Bitmap getBitmap(Resources res, int id) {
if (res == null) return null;
return BitmapFactory.decodeResource(res, id);
public static Bitmap getBitmap(int id) {
return BitmapFactory.decodeResource(Utils.getContext().getResources(), id);
}
/**
* 获取bitmap
*
* @param res 资源对象
* @param id 资源id
* @param maxWidth 最大宽度
* @param maxHeight 最大高度
* @return bitmap
*/
public static Bitmap getBitmap(Resources res, int id, int maxWidth, int maxHeight) {
if (res == null) return null;
public static Bitmap getBitmap(int id, int maxWidth, int maxHeight) {
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, id, options);
BitmapFactory.decodeResource(Utils.getContext().getResources(), id, options);
options.inSampleSize = calculateInSampleSize(options, maxWidth, maxHeight);
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, id, options);
return BitmapFactory.decodeResource(Utils.getContext().getResources(), id, options);
}
/**
......@@ -715,8 +711,8 @@ public final class ImageUtils {
* renderScript模糊图片
* <p>API大于17</p>
*
* @param src 源图片
* @param radius 模糊半径(0...25)
* @param src 源图片
* @param radius 模糊半径(0...25)
* @return 模糊后的图片
*/
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
......@@ -982,15 +978,15 @@ public final class ImageUtils {
int newHeight = src.getHeight() + doubleBorder;
Bitmap ret = Bitmap.createBitmap(newWidth, newHeight, src.getConfig());
Canvas canvas = new Canvas(ret);
Rect rect = new Rect(0, 0, newWidth, newHeight);
//noinspection SuspiciousNameCombination
canvas.drawBitmap(src, borderWidth, borderWidth, null);
Paint paint = new Paint();
paint.setColor(color);
paint.setStyle(Paint.Style.STROKE);
// setStrokeWidth是居中画的,所以要两倍的宽度才能画,否则有一半的宽度是空的
paint.setStrokeWidth(doubleBorder);
Rect rect = new Rect(0, 0, newWidth, newHeight);
canvas.drawRect(rect, paint);
//noinspection SuspiciousNameCombination
canvas.drawBitmap(src, borderWidth, borderWidth, null);
if (recycle && !src.isRecycled()) src.recycle();
return ret;
}
......
package com.blankj.utilcode.util;
import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.support.annotation.ColorInt;
import android.support.annotation.IdRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.ref.WeakReference;
/**
* <pre>
* author: Blankj
......@@ -23,12 +28,15 @@ import android.widget.Toast;
*/
public final class ToastUtils {
private static final int DEFAULT_COLOR = 0x12000000;
private static Toast sToast;
private static int gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
private static int xOffset = 0;
private static int yOffset = (int) (64 * Utils.getContext().getResources().getDisplayMetrics().density + 0.5);
@SuppressLint("StaticFieldLeak")
private static View customView;
private static int gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
private static int xOffset = 0;
private static int yOffset = (int) (64 * Utils.getContext().getResources().getDisplayMetrics().density + 0.5);
private static int backgroundColor = DEFAULT_COLOR;
private static int backgroundResource = -1;
private static int messageColor = DEFAULT_COLOR;
private static WeakReference<View> sViewWeakReference;
private static Handler sHandler = new Handler(Looper.getMainLooper());
private ToastUtils() {
......@@ -55,7 +63,7 @@ public final class ToastUtils {
*/
public static void setView(@LayoutRes int layoutId) {
LayoutInflater inflate = (LayoutInflater) Utils.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
ToastUtils.customView = inflate.inflate(layoutId, null);
sViewWeakReference = new WeakReference<>(inflate.inflate(layoutId, null));
}
/**
......@@ -63,21 +71,53 @@ public final class ToastUtils {
*
* @param view 视图
*/
public static void setView(View view) {
ToastUtils.customView = view;
public static void setView(@Nullable View view) {
sViewWeakReference = view == null ? null : new WeakReference<>(view);
}
/**
* 获取吐司view
*
* @return view 自定义view
* @return view
*/
public static View getView() {
if (customView != null) return customView;
if (sViewWeakReference != null) {
final View view = sViewWeakReference.get();
if (view != null) {
return view;
}
}
if (sToast != null) return sToast.getView();
return null;
}
/**
* 设置背景颜色
*
* @param backgroundColor 背景色
*/
public static void setBackgroundColor(@ColorInt int backgroundColor) {
ToastUtils.backgroundColor = backgroundColor;
}
/**
* 设置背景资源
*
* @param backgroundResource 背景资源
*/
public static void setBackgroundResource(@IdRes int backgroundResource) {
ToastUtils.backgroundResource = backgroundResource;
}
/**
* 设置消息颜色
*
* @param messageColor 颜色
*/
public static void setMessageColor(@ColorInt int messageColor) {
ToastUtils.messageColor = messageColor;
}
/**
* 安全地显示短时吐司
*
......@@ -270,6 +310,44 @@ public final class ToastUtils {
show(format, Toast.LENGTH_LONG, args);
}
/**
* 安全地显示短时自定义吐司
*/
public static void showCustomShortSafe() {
sHandler.post(new Runnable() {
@Override
public void run() {
show("", Toast.LENGTH_SHORT);
}
});
}
/**
* 安全地显示长时自定义吐司
*/
public static void showCustomLongSafe() {
sHandler.post(new Runnable() {
@Override
public void run() {
show("", Toast.LENGTH_LONG);
}
});
}
/**
* 显示短时自定义吐司
*/
public static void showCustomShort() {
show("", Toast.LENGTH_SHORT);
}
/**
* 显示长时自定义吐司
*/
public static void showCustomLong() {
show("", Toast.LENGTH_LONG);
}
/**
* 显示吐司
*
......@@ -310,12 +388,34 @@ public final class ToastUtils {
*/
private static void show(CharSequence text, int duration) {
cancel();
if (customView != null) {
sToast = new Toast(Utils.getContext());
sToast.setView(customView);
sToast.setDuration(duration);
} else {
sToast = Toast.makeText(Utils.getContext(), text, duration);
boolean isCustom = false;
if (sViewWeakReference != null) {
final View view = sViewWeakReference.get();
if (view != null) {
sToast = new Toast(Utils.getContext());
sToast.setView(view);
sToast.setDuration(duration);
isCustom = true;
}
}
if (!isCustom) {
if (messageColor != DEFAULT_COLOR) {
SpannableString spannableString = new SpannableString(text);
ForegroundColorSpan colorSpan = new ForegroundColorSpan(messageColor);
spannableString.setSpan(colorSpan, 0, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sToast = Toast.makeText(Utils.getContext(), spannableString, duration);
} else {
sToast = Toast.makeText(Utils.getContext(), text, duration);
}
}
View view = sToast.getView();
if (backgroundColor != DEFAULT_COLOR || backgroundResource != -1) {
if (backgroundColor != DEFAULT_COLOR) {
view.setBackgroundColor(backgroundColor);
}
if (backgroundResource != -1) {
view.setBackgroundResource(backgroundResource);
}
}
sToast.setGravity(gravity, xOffset, yOffset);
sToast.show();
......
......@@ -35,6 +35,10 @@ import static com.blankj.utilcode.util.TestUtils.FILE_SEP;
@Config(manifest = Config.NONE)
public class CacheUtilsTest {
static {
TestUtils.init();
}
private final String path1 = TestUtils.TEST_PATH + FILE_SEP + "cache" + FILE_SEP + "cache1" + FILE_SEP;
private final String path2 = TestUtils.TEST_PATH + FILE_SEP + "cache" + FILE_SEP + "cache2" + FILE_SEP;
private final File file1 = new File(path1);
......@@ -54,10 +58,6 @@ public class CacheUtilsTest {
private Bitmap mBitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.RGB_565);
private Drawable mDrawable = new BitmapDrawable(Utils.getContext().getResources(), mBitmap);
static {
TestUtils.init();
}
public CacheUtilsTest() {
try {
mJSONObject.put("class", "CacheUtils");
......
......@@ -22,12 +22,12 @@ import java.util.Map;
@Config(manifest = Config.NONE)
public class SPUtilsTest {
private SPUtils spUtils1;
private SPUtils spUtils2;
static {
TestUtils.init();
}
private SPUtils spUtils1;
private SPUtils spUtils2;
@Before
public void setUp() throws Exception {
......
......@@ -116,5 +116,6 @@ public class TestUtils {
@Test
public void test() throws Exception {
}
}
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册