我們在開發應用過程中,可能會遇到這樣的需求,在豎屏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()
)
}
}