androidstudio图片居中_Android开发-自定义View-AndroidStudio(二十二)FontMetrics计算文字居中...

本文介绍了如何在Android中创建一个自定义View,并利用FontMetrics进行文字居中布局。通过示例代码展示了如何在Canvas上绘制网格并绘制居中的数字。
摘要由CSDN通过智能技术生成

转载请注明出处:

http://blog.csdn.net/iwanghang/

觉得博文有用,请点赞,请评论,请关注,谢谢!~

老规矩,先上图,看个效果,如果符合你的项目或者确定你要了解的内容,再往下看吧:

先了解一下FontMetrics,然后再看看Demo:

MainActivity.java:

package com.iwanghang.newview;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

getSupportActionBar().hide();

//setContentView(R.layout.activity_main);

NewView newView = new NewView(this);

setContentView(newView);

}

}NewView.java:

package com.iwanghang.newview;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

public class NewView extends View{

// 单元格的宽度和高度

private float width;

private float height;

public NewView(Context context, AttributeSet attrs) {

super(context, attrs);

}

public NewView(MainActivity mainActivity) {

super(mainActivity);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

this.width = w / 9f;

this.height = h / 9f;

super.onSizeChanged(w, h, oldw, oldh);

}

// 当Android系统需要绘制一个View对象时,就会调用该对象的onDraw

@Override

protected void onDraw(Canvas canvas) {

// 画背景

Paint backgroundPaint = new Paint();

backgroundPaint.setColor(getResources().getColor(R.color.colorBackground));

canvas.drawRect(0,0,getWidth(),getHeight(),backgroundPaint);

Paint darkPaint = new Paint();

darkPaint.setColor(getResources().getColor(R.color.colorDark));

Paint hilitePaint = new Paint();

hilitePaint.setColor(getResources().getColor(R.color.colorHilite));

Paint lightPaint = new Paint();

lightPaint.setColor(getResources().getColor(R.color.colorLight));

// 绘制9X9的网络格

// 两条距离为1的直线,视觉上会有割裂的效果

for (int i = 0; i < 9; i++) {

canvas.drawLine(0, i*height, getWidth(), i*height, lightPaint);

canvas.drawLine(0, i*height+1, getWidth(), i*height+1, hilitePaint);

canvas.drawLine(i*width, 0, i*width, getHeight(), lightPaint);

canvas.drawLine(i*width+1, 0, i*width+1, getHeight(), hilitePaint);

}

// 绘制3X3的网络格

for (int i = 0; i < 9; i++) {

if (i % 3 != 0) {

continue;

}

canvas.drawLine(0, i*height, getWidth(), i*height, darkPaint);

canvas.drawLine(0, i*height+1, getWidth(), i*height+1, hilitePaint);

canvas.drawLine(i*width, 0, i*width, getHeight(), darkPaint);

canvas.drawLine(i*width+1, 0, i*width+1, getHeight(), hilitePaint);

}

// 绘制数字

Paint numberPaint = new Paint();

numberPaint.setColor(Color.BLACK);

numberPaint.setStyle(Paint.Style.STROKE);

numberPaint.setTextSize(height*0.75f);

numberPaint.setTextAlign(Paint.Align.CENTER);

numberPaint.setAntiAlias(true); // 抗锯齿

/**

* 数字居中位置

* x轴居中比较容易计算

* y轴居中的计算,依赖于FontMetrics,大家很容易百度到相关的知识

*/

Paint.FontMetrics fm = numberPaint.getFontMetrics();

float x = width / 2;

float y = height / 2 - (fm.ascent + fm.descent) / 2;

canvas.drawText("1", 0 * width + x, 0 * height + y, numberPaint);

canvas.drawText("2", 1 * width + x, 1 * height + y, numberPaint);

canvas.drawText("3", 2 * width + x, 2 * height + y, numberPaint);

canvas.drawText("4", 3 * width + x, 3 * height + y, numberPaint);

canvas.drawText("5", 4 * width + x, 4 * height + y, numberPaint);

super.onDraw(canvas);

}

}colors.xml:

#3F51B5

#303F9F

#FF4081

#ffffff

#64c6d4ef

#6456648f

#ffe6f0ff

转载请注明出处:

http://blog.csdn.net/iwanghang/

欢迎移动开发爱好者交流

沈阳或周边城市公司有意开发Android,请与我联系

联系方式

微信:iwanghang

QQ:413711276

邮箱:iwanghang@qq.com

觉得博文有用,请点赞,请评论,请关注,谢谢!~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值