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

来源:互联网 发布:java项目界面 编辑:程序博客网 时间:2024/05/22 11:51

写在开头

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

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

  • 富文本实现各种字符串拼接,主要为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的一个实现例子如下

    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接口。

这里写图片描述

写在结尾

会一直总结一些项目中用到的知识,不管难易,仅做记录学习!