Android 开发问题记录

252 阅读6分钟

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)
}