Android 开发问题记录
Rect
这是一个我们常用的一个“绘画相关的工具类”,常用语描述长方形/正方形,他只有4个属性
public int left;
public int top;
public int right;
public int bottom;
本Rect最左侧到屏幕的左侧的距离是 left 本Rect最上面到屏幕上方的距离是 top 本Rect最右侧到屏幕左侧的距离是 right 本Rect最下面到屏幕上方的距离是 bottom
这四个属性不单单描述了这个 长方形4个点的坐标,间接的描述出这个长方形的尺寸
长 = bottom - top
宽 = right - left
构造函数
public Rect() { }
public Rect(int left, int top, int right, int bottom) {
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
public Rect(Rect r) {
if (r == null) {
left = top = right = bottom = 0;
} else {
left = r.left;
top = r.top;
right = r.right;
bottom = r.bottom;
}
}
3个构造函数都是围绕着初始化这4个属性来做的,无论是传过来一个新Rect对象,还是传入具体的尺寸。
常用方法
获取“宽”
public final int width() {
return right - left;
}
获取“高”
public final int height() {
return bottom - top;
}
有效性的判断
因为left是最左侧,right比left还小不就不成形了么? 宽高同是如此
public final boolean isEmpty() {
return left >= right || top >= bottom;
}
全部置0操作
public void setEmpty() {
left = right = top = bottom = 0;
}
设置参数方法,和构造函数的区别仅在于不会创建新对象
public void set(int left, int top, int right, int bottom) {
this.left = left;
this.top = top;
this.right = right;
this.bottom = bottom;
}
SpannableString和SpannableStringBuilder的使用详解
SpannableString和SpannableStringBuilder的简介
SpannableStringBuilder,SpannableString其实和String一样,都是一种字符串类型。
不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示。比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,总之,SpannableString、SpannableStringBuilder与String一样,可以认为是String的升级版。SpannableString与SpannableStringBuilder区别就比如String和StringBuilder一样。
setSpan()
void setSpan (Object what, int start, int end, int flags);
object what; //对应的各种Span,后面会提到;
int start; //开始应用指定Span的位置,索引从0开始
int end; //结束应用指定Span的位置,不包含
int flags;
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE; //前后都不包括(在标志位【start,end)前后添加文字,新添加的文字不会有任何设置的属性)
Spannable.SPAN_EXCLUSIVE_INCLUSIVE; //前面不包括,后面包括。(在标志位【start,end)前添加文字,新添加的文字不会有任何设置的属性,后边的添加的文字会带有设置的what属性)
Spannable.SPAN_INCLUSIVE_EXCLUSIVE; //前面包括,后面不包括。(在标志位【start,end)后添加文字,新添加的文字不会有任何设置的属性,前边边的添加的文字会带有设置的what属性)
Spannable.SPAN_INCLUSIVE_INCLUSIVE; //前后都包括。前后都不包括(在标志位【start,end)前后添加文字,新添加的文字会有设置的属性)
object what 各种设置
字体颜色:ForegroundColorSpan
//字体颜色
val stringBuilder = SpannableStringBuilder(content)
val foregroundColorSpan = ForegroundColorSpan(Color.parseColor("#FF4040"))
stringBuilder.setSpan(foregroundColorSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
ForegroundColorSpan foregroundColorSpan=new ForegroundColorSpan(Color.parseColor("#FF4040"));
stringBuilder.setSpan(foregroundColorSpan,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
背景颜色:BackgroundColorSpan
val stringBuilder = SpannableStringBuilder(content)
val backgroundColorSpan = BackgroundColorSpan(Color.parseColor("#FF4040"))
stringBuilder.setSpan(backgroundColorSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
//背景颜色
BackgroundColorSpan backgroundColorSpan=new BackgroundColorSpan(Color.parseColor("#FF4040"));
stringBuilder.setSpan(backgroundColorSpan,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
文本可点击,有点击事件 : ClickableSpan
val stringBuilder = SpannableStringBuilder(content)
val clickableSpan = object : ClickableSpan() {
override fun onClick(widget: View) {
Log.i("clickable", content)
}
override fun updateDrawState(ds: TextPaint) {
//去掉可点击文字的下划线
ds.isUnderlineText = false
}
}
//文本可点击,有点击事件
stringBuilder.setSpan(clickableSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
//设置此方法后,点击事件才能生效
//textView.setMovementMethod(LinkMovementMethod.getInstance())
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
ClickableSpan clickableSpan=new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this,"可点击",Toast.LENGTH_LONG).show();
}
@Override
public void updateDrawState(TextPaint ds) {
//去掉可点击文字的下划线
ds.setUnderlineText(false);
}
};
//文本可点击,有点击事件
stringBuilder.setSpan(clickableSpan,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置此方法后,点击事件才能生效
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(stringBuilder);
模糊效果:BlurMaskFilter
val stringBuilder = SpannableStringBuilder(content)
val filter = BlurMaskFilter(4.0f, BlurMaskFilter.Blur.OUTER)
val maskFilterSpan = MaskFilterSpan(filter)
stringBuilder.setSpan(maskFilterSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
MaskFilter filter=new BlurMaskFilter(4.0f,BlurMaskFilter.Blur.OUTER);
MaskFilterSpan maskFilterSpan=new MaskFilterSpan(filter);
stringBuilder.setSpan(maskFilterSpan,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
弃用线效果:StrikethroughSpan
val stringBuilder = SpannableStringBuilder(content)
stringBuilder.setSpan(StrikethroughSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
//textView.setMovementMethod(LinkMovementMethod.getInstance())
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
stringBuilder.setSpan(new StrikethroughSpan(),0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(stringBuilder);
下划线效果:UnderlineSpan
val stringBuilder = SpannableStringBuilder(content)
val underlineSpan = UnderlineSpan()
//下划线效果
stringBuilder.setSpan(underlineSpan, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
UnderlineSpan un=new UnderlineSpan();
//下划线效果
stringBuilder.setSpan(un,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
字体绝对大小效果:AbsoluteSizeSpan
val stringBuilder = SpannableStringBuilder(content)
val ab = AbsoluteSizeSpan(30, true)
//文本字体绝对的大小
stringBuilder.setSpan(ab, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
AbsoluteSizeSpan ab=new AbsoluteSizeSpan(30,true);
//文本字体绝对的大小
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
设置图片基于底部:DynamicDrawableSpan
val stringBuilder = SpannableStringBuilder(content)
val ab = object : DynamicDrawableSpan() {
override fun getDrawable(): Drawable {
//val drawable = getResources().getDrawable(R.drawable.close)
drawable.setBounds(0, 0, 50, 50)
return drawable
}
}
stringBuilder.setSpan(ab, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
DynamicDrawableSpan ab=new DynamicDrawableSpan() {
@Override
public Drawable getDrawable() {
Drawable drawable = getResources().getDrawable(R.drawable.close);
drawable.setBounds(0,0,50,50);
return drawable;
}
};
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
设置图片:ImageSpan
val stringBuilder = SpannableStringBuilder(content)
//val drawable = getResources().getDrawable(R.drawable.close)
drawable.setBounds(0, 0, 100, 100)
val ab = ImageSpan(drawable)
stringBuilder.setSpan(ab, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
Drawable drawable = getResources().getDrawable(R.drawable.close);
drawable.setBounds(0,0,100,100);
ImageSpan ab=new ImageSpan(drawable);
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
相对字体大小:RelativeSizeSpan
val stringBuilder = SpannableStringBuilder(content)
val ab = RelativeSizeSpan(3.0f)
stringBuilder.setSpan(ab, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
RelativeSizeSpan ab=new RelativeSizeSpan(3.0f);
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
基于X的缩放:ScaleXSpan
val stringBuilder = SpannableStringBuilder(content)
val scaleX = ScaleXSpan(3.0f)
stringBuilder.setSpan(scaleX,0,5,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
ScaleXSpan ab=new ScaleXSpan(3.0f);
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
字体样式:粗体、斜体等:StyleSpan
val stringBuilder = SpannableStringBuilder(content)
val style = StyleSpan(Typeface.BOLD_ITALIC)
stringBuilder.setSpan(style,0,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
StyleSpan ab=new StyleSpan(Typeface.BOLD_ITALIC);
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
上标:SubscriptSpan
val stringBuilder = SpannableStringBuilder(content)
val ab = SuperscriptSpan()
stringBuilder.setSpan(ab, 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
SuperscriptSpan ab=new SuperscriptSpan();
stringBuilder.setSpan(ab,1,2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
字体、大小、样式和颜色:TextAppearanceSpan
val stringBuilder = SpannableStringBuilder(content)
//自定义文本样式
val ab = TextAppearanceSpan(context, style)
stringBuilder.setSpan(ab, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
//自定义文本样式
TextAppearanceSpan ab=new TextAppearanceSpan(this, android.R.style.TextAppearance_Medium);
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
文本字体 : TypefaceSpan
val stringBuilder = SpannableStringBuilder(content)
//文字字体
val ab = TypefaceSpan("serif")
stringBuilder.setSpan(ab, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
//文字字体
TypefaceSpan ab=new TypefaceSpan ("serif");
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(stringBuilder);
文本超链接:URLSpan
val stringBuilder = SpannableStringBuilder(content)
val urlSpan = URLSpan("http://www.baidu.com")
stringBuilder.setSpan(urlSpan, 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
//textView.setMovementMethod(LinkMovementMethod())
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
//文字字体
URLSpan ab=new URLSpan ("http://www.baidu.com");
stringBuilder.setSpan(ab,0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(new LinkMovementMethod());
textView.setText(stringBuilder);
下标:SubscriptSpan
val stringBuilder = SpannableStringBuilder(content)
val subscriptSpan = SubscriptSpan()
stringBuilder.setSpan(subscriptSpan, 3, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
//textView.setMovementMethod(LinkMovementMethod())
String content="abcdefghijklmnopqrstuvdxyz";
SpannableStringBuilder stringBuilder=new SpannableStringBuilder(content);
SubscriptSpan ab=new SubscriptSpan();
stringBuilder.setSpan(ab,3,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setMovementMethod(new LinkMovementMethod());
textView.setText(stringBuilder);
Kotlin (with / T.run / T.let / T.apply / T.also) 的详细比较
-
普通函数与扩展函数 (with 与 T.run)
-
this参数与it参数(T.run 与 T.let、T.apply 与 T.also)
-
返回this或返回最后一行(T.let 和 T.also、T.apply 与 T.run)
是否扩展函数 调用参数方式 返回值with 是 this 最后一行 T.run 否 this 最后一行 T.let 否 it 最后一行 T.apply 否 this this T.also 否 it this
CardView 属性介绍
CardView_cardBackgroundColor //设置背景色
CardView_cardCornerRadius //设置圆角大小
CardView_cardElevation //设置z轴阴影
CardView_cardMaxElevation //设置z轴最大高度值
CardView_cardUseCompatPadding //是否使用CompadPadding
//设置内边距,V21+的版本和之前的版本具有一样的计算方式。
//部分机器不开这个属性会导致卡片效果“消失”,如荣耀6(6.0系统)。
CardView_cardPreventCornerOverlap 是否使用PreventCornerOverlap
//在V20和之前的版本中添加内边距,这个属性为了防止内容和边角的重叠
CardView_contentPadding //内部边距,子View与CardView的距离
CardView_contentPaddingLeft //内部左侧边距
CardView_contentPaddingTop //内部顶部边距
CardView_contentPaddingRight //内部右侧边距
CardView_contentPaddingBottom //内部底部边距
Kotlin apply() 扩展函数应用
Intent(context,FlightSingleCalendarActivity::class.java).apply { putExtras(Bundle().apply {
putSerializable("pickCommonCalendar",domesticDTDateParmes)
})
context.startActivity(this)
}