寫在開頭
無論是寫文章,還是摘錄文章,都是一個梳理思維,學習成長的過程,當忘記了還可以回來翻一下,看一看,或者有什麼新的想法可以重新編輯一下,方便了自己,也分享了知識,有意的可以一塊學習,互相交流。謝謝大家!有錯誤或者意見還請指出共同進步。
下面是內容列表,有需要的您就看看!!!
- 富文本實現各種字符串拼接,主要爲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接口。
寫在結尾
會一直總結一些項目中用到的知識,不管難易,僅做記錄學習!