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

写在开头

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

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

  • 富文本实现各种字符串拼接,主要为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接口。

这里写图片描述

写在结尾

会一直总结一些项目中用到的知识,不管难易,仅做记录学习!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值