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

這裏寫圖片描述

寫在結尾

會一直總結一些項目中用到的知識,不管難易,僅做記錄學習!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章