我们在开发应用过程中,可能会遇到这样的需求,在竖屏Activity中横向显示一个Toast提示,当然每个人思考的方式不一样,实现的方法也会有很多种了,这样提供这样一种思路供大家参考。
-
效果图
gif动画不是很清晰,这不重要~~~~~ -
实现思路,在Toast中有setView这个方法,我们可以设置一个竖向显示文字横向显示的View,然后再设置Toast的位置不就可以。
//自定义一个View,通过旋转画布来绘制View上显示的文字
public class TextView1 extends View {
private Paint paint;
private String text = "";
public TextView1(Context context) {
super(context);
init();
}
public TextView1(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public TextView1(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
paint = new Paint();
paint.setTextSize(dp2px(15));
paint.setColor(Color.WHITE);
}
public void setText(String text) {
this.text = text;
}
private int dp2px(int dp) {
float density = getContext().getResources().getDisplayMetrics().density;
return (int) (dp * density + 0.5f);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.translate(dp2px(2), dp2px(1));
canvas.rotate(90);//旋转90度
canvas.drawText(text, 0, 0, paint);
canvas.save();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension((int) paint.measureText("我") + dp2px(2),
(int) paint.measureText(text) + dp2px(2));
}
}
然后调用Toast的setView方法
Toast toast = new Toast(context);
TextView1 textView = new TextView1(context);
textView.setBackgroundColor(Color.BLACK);
textView.setText("测试测试测试");
toast.setView(textView);
toast.setMargin(-1f, 0);
toast.setGravity(Gravity.CENTER_VERTICAL,700,0);
toast.show();
- kotlin版
class TextView1 : View {
private var paint: Paint? = null
var text = ""
set(value) {
field = value
}
init {
paint = Paint()
paint!!.textSize = dp2px(15)
paint!!.color = Color.WHITE
}
companion object {
fun dp2px(dp: Int): Float {
val density = Resources.getSystem().displayMetrics.density
return dp * density + 0.5f
}
}
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr)
override fun onDraw(canvas: Canvas) {
canvas.translate(dp2px(2), dp2px(1))
canvas.rotate(90f)
canvas.drawText(text, 0f, 0f, paint)
canvas.save()
}
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
setMeasuredDimension(
(paint!!.measureText("我") + dp2px(2)).toInt(),
(paint!!.measureText(text) + dp2px(2)).toInt()
)
}
}