在开发Android程序的时候,当我们引入一个TextView控件时,它的效果是这样的,默认横着显示。如左图,那么如何做到右图中的效果呢。你可能会说使用多个TextView,其实完全没有必要浪费那个精力。
横着竖着
只需要一个属性:
android:ems="1"
使用这个属性的前提是:
android:layout_width="wrap_content"
整体就是:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ems="1"
android:text="字体竖着显示"
android:textColor="#000000"
android:textSize="34sp" />
一、加载Html代码
String html="<a href=\"http://www.111cn.net \"> 百度</a>;";
textView.setMovementMethod(LinkMovementMethod.getInstance());//允许超链接点击跳转到浏览器
textView.setText(Html.fromHtml(html));
二、加载src标签
1、加载本地图片
String html="<img" width=100% src=\"file:///system/media/Pre-loaded/Pictures/Picture_01_Greenery.jpg\" />";
textView.setText(Html.fromHtml(html, new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable = null;
try {
drawable = Drawable.createFromStream(new URL(source).openStream(), null);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
} catch (IOException e) {
e.printStackTrace();
}
return drawable;
}
},null));
注意:file:/别忘了加
Html还有个三参数的fronHtml方法,三个参数分别是:String source(图片资源的路径),ImageGetter imageGetter(实现ImageGetter类的对象),TagHandler tagHandler(暂不知什么用,不过这里设为null就行了)
ImageGetter类是Html类的一个静态接口,有个方法getDrawable,返回值为Drawable,作用是取得图片的Drawable
drawable = Drawable.createFromStream(new URL(source).openStream(), null);
这句代码,有一点要说,不要用网上许多人用的:
drawable= Drawable.createFromPath(source);
可能会报FileNotFound错误。
2、加载网络图片
html代码和之前差不多,把路径换成网络图片的地址就行
比如:
String html="<img" width=100% src=\"http://img0.bdstatic.com/img/image/shouye/xiaoxiao/%E5%AE%A0%E7%89%A9622.jpg\" />";
但是ImageGetter的getDrawable方法需要变化:
这里使用Piccsso框架加载网络图片,不会的同学可以去百度一下
private class MyImageGetter implements Html.ImageGetter {
private URLDrawable urlDrawable = null;
@Override
public Drawable getDrawable(final String source) {
urlDrawable = new URLDrawable();
Picasso.with(context).load(source).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
urlDrawable.bitmap = bitmap;
urlDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());
textView.setText(textView.getText());//不加这句显示不出来图片,原因不详
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
return urlDrawable;
}
}
URLDrawable类:
/**
* Created by Administrator on 2016/6/28 0028.
*/
public class URLDrawable extends BitmapDrawable {
public Bitmap bitmap;
@Override
public void draw(Canvas canvas) {
super.draw(canvas);
if (bitmap != null) {
canvas.drawBitmap(bitmap, 0, 0, getPaint());
}
}
}
调用方法如下:
textView.setText(Html.fromHtml(html, new MyImageGetter(), null));
下面我们一起来看一篇关于Picasso的使用及内存优化的例子,希望这篇教程能够给各位深入理解到Picasso的使用及内存优化方法哦。一、Picasso介绍
picasso是Square公司开源的一个Android第三方图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。
二、Picasso基本用法
Picasso.with(mContext).load(imageUrl).into(imageView);
代码很简洁。这一行代码解决了一下问题:
1.自动将图像缓存在本地
2.通过图片压缩转换以减少内存消耗
3.自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载
三、Picasso其他用法
1)在Adapter中使用
@Override
public void getView(int position, View convertView, ViewGroup parent) {
SquaredImageView view = (SquaredImageView) convertView;
if (view == null) {
view = new SquaredImageView(mContext);
}
String url = getItem(position);
Picasso.with(mContext).load(url).into(view);
}
2)图片转换
1
Picasso.with(mContext).load(imageUrl).resize(200,200).centerCrop().into(imageView);
还可以自定义转换:
Transformation transformation = new Transformation() {
@Override
public Bitmap transform(Bitmap source) {
int targetWidth = getWidth();
double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
int targetHeight = (int) (targetWidth * aspectRatio);
Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (result != source) {
//如果大小是相同的,相同的位图就会被返回
source.recycle();
}
return result;
}
@Override
public String key() {
return "transformation" + " desiredWidth";
}
};
定义好Transformation后,在Picasso设置transform
Picasso.with(mContext).load(imageUrl).transform(transformation).into(viewHolder.mImageView);
或者通过实现Transformation接口自定义
public class CropSquareTransformation implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap result = Bitmap.createBitmap(source, x, y, size, size);
if (result != source) {
source.recycle();
}
return result;
}
@Override
public String key() {
return "square()";
}
}
然后将CropSquareTransformation的对象传递给transform方法即可。
3)图片未正常显示时默认的图片,通过placeholder()设置;图片显示错误时显示的默认图片,通过error()设置
Picasso.with(mContext)
.load(url)
.placeholder(R.mipmap.icon_loading)
.error(R.mipmap.icon_loading)
.into(imageView);
4)加载Resources, assets, files, content providers中的资源文件
Picasso.with(mContext).load(R.mipmap.icon).into(imageView);
Picasso.wiht(mContext).load(new File(...)).into(imageView);
四、内存优化
1)查看大图放弃memory cache
Picasso默认会使用设备的15%的内存作为内存图片缓存,且现有的api无法清空内存缓存。我们可以在查看大图时放弃使用内存缓存,图片从网络下载完成后会缓存到磁盘中,加载会从磁盘中加载,这样可以加速内存的回收。
Picasso.with(mContext)
.load(imageUrl)
.memoryPolicy(NO_CACHE, NO_STORE)
.into(imageView);
其中memoryPolicy的NO_CACHE是指图片加载时放弃在内存缓存中查找,NO_STORE是指图片加载完不缓存在内存中。
2)列表页滑动优化
picasso可以对多个加载请求设置相同的tag,即
Object tag = new Object();
Picasso.with(mContext)
.load(url)
.resize(200,200)
.centerCrop()
.tag(tag)
.into(imageView);
例如在RecyclerView滑动时监听,处理不同的表现:
mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState){
if (newState == RecyclerView.SCROLL_STATE_IDLE){
Picasso.with(mContext).resumeTag(tag);
}else{
Picasso.with(mContext).pauseTag(tag);
}
});
一段文字,如果行间距很小的话看着就会很不舒服,我们在使用word文档的时候行间距是可以自己调整的,那么在Android开发的过程中如果一大段很长的文字如何设置行间距呢,很简单只需要一行代码:
android:lineSpacingExtra="3dp"
分享三张效果图:
第一张,没有设置行间距的,使用系统默认的效果:
第三张,设置为10dp的效果,更明显: