❶ android 如何实现竖排文字显示
在android.graphics.Canvas类中有个沿路径画字的方法
void drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
Draw the text, with origin at (x,y), using the specified paint, along the specified path.
void drawTextOnPath(char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
Draw the text, with origin at (x,y), using the specified paint, along the specified path.
Test.java代码://需要在layout中定义Test,且设置背景,在java代码中设置test Text
public class Test extends View {
private Paint paint;
private Path path;
private Matrix matrix;
private int width = -1;
private int height = -1;
private float left = 3;
private float top = 18;
private String title = "";
BitmapDrawable drawable = (BitmapDrawable) getBackground();
public Test(Context context, AttributeSet attrs) {
super(context, attrs);
paint = new Paint();
paint.setColor(Color.WHITE);//定义字体颜色
paint.setTextSize(14);//定义字体大小
path = new Path();
path.lineTo(0,500);//定义字符路径
matrix = new Matrix();
Log.v("onMeasure", "2");
}
@Override
protected void onDraw(Canvas canvas) {
//画背景
Bitmap b = Bitmap.createBitmap(drawable.getBitmap(),0,0,width,height);
canvas.drawBitmap(b, matrix, paint);
//画字
showText(canvas, title);
}
private void showText(Canvas canvas, String text){
float w;
final int len = text.length();
float py = 0 + top;
for(int i=0; i<len; i ++){
char c = text.charAt(i);
w = paint.measureText(text, i, i+1);//获取字符宽度
StringBuffer b = new StringBuffer();
b.append(c);
if(py > 81){//定义字的范围
return;
}
if(isChinese(c)){
py += w;
if(py > 81){
return;
}
canvas.drawText(b.toString(), left, py, paint); //中文处理方法
}else {
canvas.drawTextOnPath(b.toString(), path, py, -left-2, paint);//其他文字处理方法
py += w;
}
}
}
public void setText(String title){
this.title = title;
}
public String getText(){
return title;
}
private boolean isChinese(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {
return true;
}
return false;
}
//重写View大小方法,使view大小为背景图片大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
if (null != getBackground()) {
int h = drawable.getIntrinsicHeight();
int w = drawable.getIntrinsicWidth();
Log.v("onMeasure", "null != getBackground() h:" + h + " w:" + w);
width = w;
height = h;
setMeasuredDimension(w, h);
} else {
width = widthMeasureSpec;
height = heightMeasureSpec;
super.measure(widthMeasureSpec, heightMeasureSpec);
}
}
}
在Android中,若要通过程序改变屏幕显示的方向,必须要覆盖setRequestedOrientation()方法,而若要取得目前的屏幕方向,则需要访问getRequestedOrientation()方法。本范例为求简要示范更改做法,设计了一个按钮,当单击按钮的同时,判断当下的屏幕方向,例如竖排(PORTRAIT),则将其更改为横排(LANDSCAPE);若为横排(LANDSCAPE),则将其更改为竖排(PORTRAIT)
❷ android canvas的drawText方法 如何设置字体大小和格式。
Canvas相当于画布,字体的大小格式在Paint上设置才正确, Paint 相当于画笔。代码如下,没有具体参数:
Paint paint = new Paint();
paint.setTextSize(textSize);//设置字体大小
paint.setTypeface(typeface);//设置字体类型
canvas.drawText(text, x, y, paint);//使用画笔paint
@Override
public void onDraw (Canvas canvas) {
Rect targetRect = new Rect(50, 50, 1000, 200);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStrokeWidth(3);
paint.setTextSize(80);
String testString = "测试:ijkJQKA:1234";
paint.setColor(Color.CYAN);
canvas.drawRect(targetRect, paint);
paint.setColor(Color.RED);
FontMetricsInt fontMetrics = paint.getFontMetricsInt();
(2)androiddrawtext字体扩展阅读:
Screen Space - Camera
此模式类似Screen Space - Overlay,但区别是此模式将Canvas放置于某个Camera前固定距离。此Camera负责渲染所有UI元素,则摄像机参数(Camera Settings)直接影响UI表现。
比如Camera是透视模式(Perspective),则UI元素会基于Field of View的值而扭曲变形。同样的,若屏幕分辨率变更,或者视觉平截体(CameraFrustrum)改变,则Canvas自动调整自身尺寸作自适应。
❸ [Android][canvas中drawText绘制文字垂直方向居中]
由于要实现类似注册表单一样,文字作用两端对齐的效果如下图1,所以才有下面的内容。悄信
在canvas中,调用drawText绘画文隐运困字的时候,希望能够在垂直方向居中画出文字。所以需要测量出要绘画的文字的高。但具体来说,也不是获取文字的高,因为如果要垂直居中画出文字,就必须拿到文字的baseline,于是在网上搜索,找到了一篇关于获取baseline的文章(文章链接在本文底部列出),感觉就是我想要的,但是基于要怀疑一切的态度,不能你说是什么就是什么的,实践才是检验真理的唯一标准,所以下面我们来验证一下几个观点。
首先可以明确,5个位置分别是灶念top,ascent,baseline,descent,bottom。这五个位置受字号的大小影响是毋庸置疑的,这里不再讨论。这里验证了一下字体对五个位置的影响。字号默认是16,字体分别是系统默认,行书,小篆,方正姚体:
这5个位置分别用5条不同颜色的横线条展示
从效果看,字体对top,ascent,baseline,descent,bottom的位置影响并不明显。
通过Log打印的日志可以得出结果
结果:以baseline为基准线,向上为负,向下为正是正确的。
这个不是验证了,说了那么多也就是为了如何在垂直方向居中绘制文字,关键在于获取baseline位置。Canvas中的drawText中绘制文字的基准线是baseline。
使得ascent到View的是上边距与descent到View下边距距离一致即可,此段距离加上ascent的绝对值(-ascent)即为baseline的位置。
在Canvas中使用drawText绘制垂直居中文字的关键在于求出baseline的位置。获取位置的公式:
https://github.com/lgygg/MeasureHeight
http://blog.csdn.net/su1216/article/details/46900617#
❹ Android里怎么实现TextView里面的文字一个一个逐渐显示出来的动画效果
在Android开发中,如果想要实现TextView中的文字一个一个逐渐显示出来的动画效果,可以采用自定义控件的方式。具体实现步骤如下:
首先,需要创建一个自定义的View类,然后在该类中重写onDraw()方法,以便于绘制文字。这一步是必要的,因为默认的TextView并不能满足逐字显示文字的需求。
接着,获取需要显示的文字内容。这部分代码可以放在自定义View类的构造函数中,或者在外部调用时传入需要显示的文字。
为了实现逐字显示文字的效果,可以使用Handler的postDelay()方法。这个方法可以实现延迟执行某个任务。通过设置适当的时间延迟,可以让程序在指定的时间后执行显示文字的任务。
在自定义View的onDraw()方法中,可以使用DrawText()方法来绘制文字。通过循环调用DrawText()方法,可以实现逐字显示的效果。每次调用DrawText()时,只显示一部分文字,然后通过Handler的postDelay()方法设定一定的时间延迟,让程序在指定的时间后再次调用DrawText()方法,从而实现逐字显示的效果。
值得注意的是,为了保证文字显示的流畅性,可以适当调整postDelay()方法中的时间延迟值。如果时间间隔设置得太短,可能会导致文字显示不够流畅;而如果时间间隔设置得太长,则可能会使文字显示效果过于缓慢。
通过这种方式,可以在Android应用中实现TextView中的文字一个一个逐渐显示出来的动画效果。这种方式不仅能够增强界面的美观性,还可以提高用户体验。