您的位置:首页 > 移动开发 > Android开发

android学习总结(持续记录点点滴滴)

2017-07-27 11:10 489 查看

写在开头

无论是写文章,还是摘录文章,都是一个梳理思维,学习成长的过程,当忘记了还可以回来翻一下,看一看,或者有什么新的想法可以重新编辑一下,方便了自己,也分享了知识,有意的可以一块学习,互相交流。谢谢大家!有错误或者意见还请指出共同进步。

下面是内容列表,有需要的您就看看!!!

富文本实现各种字符串拼接,主要为SpannableStringBuilder的使用

android自定义字体的使用

android 通知详解

Android Parcelable和Serializable的区别与使用

富文本实现各种字符串拼接,主要为SpannableStringBuilder的使用

文字后面添加多张图片

SpannableStringBuilder spannableString = new SpannableStringBuilder();
Drawable jing = activity.getResources().getDrawable(R.mipmap.iconjing) ;
//拿到图片后修改参数,x:控件在容器X轴上的起点 y:控件在容器Y轴上的起点 width:控件的长度 height:控件的高度
jing.setBounds(0,0,DensityUtil.dip2px(activity,20),DensityUtil.dip2px(activity,20));
Drawable ding = activity.getResources().getDrawable(R.mipmap.iconding) ;
ding.setBounds(0,0, DensityUtil.dip2px(activity,20),DensityUtil.dip2px(activity,20));
//在拼接字符串的时候拼接上你图片的点数
spannableString.append(answerListInfo.getName() + " . .");
ImageSpan imageSpan = new ImageSpan(jing);
ImageSpan imageSpan1 = new ImageSpan(ding);
//创建好ImageSpan对象,替换指定位置上的图片
//Spannable.SPAN_EXCLUSIVE_EXCLUSIVE --- 不包含两端start和end所在的端点 (a,b)
//Spannable.SPAN_EXCLUSIVE_INCLUSIVE --- 不包含端start,但包含end所在的端点 (a,b]
//Spannable.SPAN_INCLUSIVE_EXCLUSIVE --- 包含两端start,但不包含end所在的端点 [a,b)
//Spannable.SPAN_INCLUSIVE_INCLUSIVE --- 包含两端start和end所在的端点 [a,b]
spannableString.setSpan(imageSpan, spannableString.length() - 3, spannableString.length() - 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(imageSpan1, spannableString.length() - 1, spannableString.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
view.setText(spannableString);


多个字符串拼接,并单独设置字体类型,大小等等。如图



//第一个字符串
SpannableStringBuilder spannableStringBefore = new SpannableStringBuilder("*");
spannableStringBefore.setSpan(new ForegroundColorSpan(Color.parseColor("#FF0000")), 0, "*".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//第二哥字符串
SpannableStringBuilder spannableStringMiddle = new SpannableStringBuilder("1.您最擅长的教研领域");
//设置颜色和自定义字体(android使用自定义字体使用请看下面)
spannableStringMiddle.setSpan(new ForegroundColorSpan(Color.parseColor("#000000")), 0, "1.您最擅长的教研领域".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringMiddle.setSpan(new CustomTypefaceSpan("1.您最擅长的教研领域", typeFace), 0, "1.您最擅长的教研领域".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//第三个字符串
SpannableStringBuilder spannableStringAfter = new SpannableStringBuilder("[单选]");
//设置颜色和字体大小
spannableStringAfter.setSpan(new AbsoluteSizeSpan(14, true), 0, "[单选]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringAfter.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFFFF")), 0, "[单选]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringBefore.append(spannableStringMiddle).append(spannableStringAfter);
tx_title.setText(spannableStringBefore);


推荐几个学习的博客资料

富文本学习传送门:

http://www.jianshu.com/p/05c03e30c849

http://blog.csdn.net/lovexjyong/article/details/17021235

android自定义字体的使用

使用

1.在您的项目的java文件夹下创建文件夹assets -> fonts 把自己的TTF(注意在使用中区分大小写)结尾的自定义字体传进去。
2.自定义CustomTypefaceSpan继承TypefaceSpan。


public class CustomTypefaceSpan extends TypefaceSpan {

private final Typeface newType;

public CustomTypefaceSpan(String family, Typeface type) {
super(family);
newType = type;
}

@Override
public void updateDrawState(TextPaint ds) {
applyCustomTypeFace(ds, newType);
}

@Override
public void updateMeasureState(TextPaint paint) {
applyCustomTypeFace(paint, newType);
}

private static void applyCustomTypeFace(Paint paint, Typeface tf) {
int oldStyle;
Typeface old = paint.getTypeface();
if (old == null) {
oldStyle = 0;
} else {
oldStyle = old.getStyle();
}

int fake = oldStyle & ~tf.getStyle();
if ((fake & Typeface.BOLD) != 0) {
paint.setFakeBoldText(true);
}

if ((fake & Typeface.ITALIC) != 0) {
paint.setTextSkewX(-0.25f);
}
paint.setTypeface(tf);
}
}


3.使用
Typeface typeFace = Typeface.createFromAsset(getAssets(), "fonts/selftext.TTF");
// 应用字体
view.setTypeface(typeFace)


android 通知详解

//添加点击通知要跳转的activity
Intent intent = new Intent(MainActivity.this,MainActivity.class);
PendingIntent activity = PendingIntent.getActivity(this, 0, intent, 0);
//获取通知管理者 和 兼容低版本的Notification对象
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//链试编程设置通知属性
Notification build = new NotificationCompat.Builder(MainActivity.this)
//设置title和内容
.setContentTitle("这是我们的标题")
.setContentText("fdasfdadasfsfadsfadsfasdfdas")
//通过设置style的方式可以设置长文本和大图片(再有的机型上无作用,可能跟手机各个厂家rom有关)
.setStyle(new NotificationCompat.BigTextStyle().bigText("fdasfdadasfsfadsfadsfasdfdasfadsfadsfadsfaaaaaaaaaaaaaaaaaaaaa"))
.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)))
//显示通知时间  和 大图标和小图标(有的机型小图标是不显示的)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher))
.setContentIntent(activity)
//点击后自动消失
.setAutoCancel(true)
//设置声音 闪光灯  震动
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/luna.ogg")))
//震动时长,间隔时长,震动时长,间隔时长…
.setVibrate(new long[]{0,1000,1000,1000})
.setLights(Color.GREEN,1000,1000)
//一切默认显示  设置了这个上面声音 闪光灯  震动可不用设置 根据手机环境来自动选择
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setOngoing(true)
.setShowWhen(false)
//设置通知上的进度条
.setProgress(100,5,false)
//设置优先级HIGH LOW MAX MIN DEFAULT
.setPriority(NotificationCompat.PRIORITY_HIGH)
.build();
// 1位flag  标记每一条通知 解决多条通知冲突的问题可利用
manager.notify(1,build);


在此值列出了自己的使用,还有好多通知的功能还没有使用到。我学习中看了几个人的博客感觉挺好的,大家一起分享学习!(包含自定义通知,音乐播放等等)

传送门:http://blog.csdn.net/w804518214/article/details/51231946

http://blog.csdn.net/u011200604/article/details/52470770

http://blog.csdn.net/workwwh/article/details/50771492

http://blog.csdn.net/vipzjyno1/article/details/25248021/

Android Parcelable和Serializable的区别与使用

作用:

Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

效率及选择

Parcelable的性能比Serializable好,在内存开销方面较小,所以在内存间数据传输时推荐使用Parcelable,如activity间传输数据,而Serializable可将数据持久化方便保存,所以在需要保存或网络传输数据时选择Serializable,因为android不同版本Parcelable可能不同,所以不推荐使用Parcelable进行数据持久化

实现

对于Serializable,类只需要实现Serializable接口,并提供一个序列化版本id(serialVersionUID)即可。而Parcelable则需要实现writeToParcel、describeContents函数以及静态的CREATOR变量,实际上就是将如何打包和解包的工作自己来定义,而序列化的这些操作完全由底层实现。

Parcelable的一个实现例子如下

<
b307
span class="hljs-keyword">public class Test implements Parcelable {

private String name ;

public Test() {
}

//内容描述接口,基本不用管
@Override
public int describeContents() {
return 0;
}
//写入接口函数,打包
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.name);
}

protected Test(Parcel in) {
this.name = in.readString();
}
//读取接口,目的是要从Parcel中构造一个实现了Parcelable的类的实例处理。因为实现类在这里还是不可知的,所以需要用到模板的方式,继承类名通过模板参数传入
//为了能够实现模板参数的传入,这里定义Creator嵌入接口,内含两个接口函数分别返回单个和多个继承类实例
public static final Parcelable.Creator<Test> CREATOR = new Parcelable.Creator<Test>() {
@Override
public Test createFromParcel(Parcel source) {
return new Test(source);
}

@Override
public Test[] newArray(int size) {
return new Test[size];
}
};
}


大家可以到Parcelable的实现是比较麻烦的,在这里推荐一个插件Parcelable code,可以帮你自动实现Parcelable接口。



写在结尾

会一直总结一些项目中用到的知识,不管难易,仅做记录学习!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: