android自定义换行居中CenterTextView

在我们开发app时,TextView一定是使用最多的控件了,android自带的TextView的功能也十分强大,但还是有些小的地方不能满足我们的需求,几天要说的这个功能也是开发中很常见的,就是,在我们显示一段超过屏幕宽度的 String时,TextView会自动换行,但系统默认的换行效果是顶起,而不是美工要求的居中。这时候,就需要我们对系统的TextView做一些改造,已使得换行后文字能够居中显示。

先看下效果图:

这种布局在IOS上很容易就实现了,android还的自定义一个View.

思路:在看android.text包中的源码时,发现几个从来没用到的类,包括:Layout,StaticLayout,DeynamicLayout等几个类,百度后得知这几个类的大概作用:

这三个Layout,就是用来对android的CharSequence及其子类进行布局的,为其传入不同的Alignment,就按照不同的Alignment去处理。代码很简单,只要从写TextView即可,代码如下:

package com.example.materialdesigndemo;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout.Alignment;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

/**********************************************************
 * @文件名称:CenterTextView.java
 * @文件作者:rzq
 * @创建时间:2015年7月2日 上午10:12:16
 * @文件描述:换行居中显示TextView
 * @修改历史:2015年7月2日创建初始版本
 **********************************************************/
public class CenterTextView extends TextView
{
	private StaticLayout myStaticLayout;
	private TextPaint tp;

	public CenterTextView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
	}

	@Override
	protected void onSizeChanged(int w, int h, int oldw, int oldh)
	{
		super.onSizeChanged(w, h, oldw, oldh);
		initView();
	}

	private void initView()
	{
		tp = new TextPaint(Paint.ANTI_ALIAS_FLAG);
		tp.setTextSize(getTextSize());
		tp.setColor(getCurrentTextColor());
		myStaticLayout = new StaticLayout(getText(), tp, getWidth(), Alignment.ALIGN_CENTER, 1.0f, 0.0f, false);
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		myStaticLayout.draw(canvas);
	}
}

使用:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="最美的不是下雨天,是和你一起躲过雨的屋檐,美丽的画面。" />

    <com.example.materialdesigndemo.CenterTextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/text"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="30dp"
        android:text="最美的不是下雨天,是和你一起躲过雨的屋檐,美丽的画面。" />
</RelativeLayout>

代码很简单,基本只需要重写onDraw()方法,让StaticLayout的实例去重新处理一下即可。这样处理后弊端就是,我们的CenterTextView只能显示文字,无法再显示drawableLeft等,如果需要,就需要在onDraw()方法中进行更复杂的处理。

Demo

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-09 00:04:44

android自定义换行居中CenterTextView的相关文章

android自己定义换行居中CenterTextView

在我们开发app时,TextView一定是使用最多的控件了,android自带的TextView的功能也十分强大.但还是有些小的地方不能满足我们的需求.几天要说的这个功能也是开发中非经常见的.就是,在我们显示一段超过屏幕宽度的 String时.TextView会自己主动换行,但系统默认的换行效果是顶起,而不是美工要求的居中. 这时候,就须要我们对系统的TextView做一些改造.已使得换行后文字可以居中显示. 先看下效果图: 这样的布局在IOS上非常easy就实现了,android还的自己定义一

Android 自定义ViewGroup之实现FlowLayout-标签流容器

本篇文章讲的是Android 自定义ViewGroup之实现标签流式布局-FlowLayout,开发中我们会经常需要实现类似于热门标签等自动换行的流式布局的功能,网上也有很多这样的FlowLayout,但不影响我对其的学习.和往常一样,主要还是想总结一下自定义ViewGroup的开发过程以及一些需要注意的地方. 按照惯例,我们先来看看效果图 一.写代码之前,有几个是问题是我们先要弄清楚的: 1.什么是ViewGroup:从名字上来看,它可以被翻译为控件组,言外之意是ViewGroup内部包含了许

Android自定义View,你必须知道的几点

为什么我们觉得自定义View是学习Android的一道坎? 为什么那么多Android大神却认为自定义View又是如此的简单? 为什么google随便定义一个View都是上千行的代码? 以上这些问题,相信学Android的同学或多或少都有过这样的疑问. 那么,看完此文,希望对你们的疑惑有所帮助. 回到主题,自定义View ,需要掌握的几个点是什么呢? 我们先把自定义View细分一下,分为两种 1) 自定义ViewGroup 2) 自定义View 其实ViewGroup最终还是继承之View,当然

onLayout源码 流程 思路详解(ANDROID自定义视图)

简介: 在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量--onMeasure():决定View的大小 2.布局--onLayout():决定View在ViewGroup中的位置 3.绘制--onDraw():如何绘制这个View. 而第3步的onDraw系统已经封装的很好了,基本不用我们来操心,只需要专注到1,2两个步骤就中好了. 第一步的测量,可以参考我之前的文章:(ANDROID自定义视图--onMeasure流程,MeasureSpec详解) 而这篇文章就来谈谈第二步:"

Android 自定义View合集

自定义控件学习 https://github.com/GcsSloop/AndroidNote/tree/master/CustomView 小良自定义控件合集 https://github.com/Mr-XiaoLiang 自定义控件三部曲 http://blog.csdn.net/harvic880925?viewmode=contents Android 从0开始自定义控件之View基础知识与概念 http://blog.csdn.net/airsaid/article/details/5

Android自定义View效果目录

1.绚丽的loading动效的实现 2.Android自定义View:进度条+冒泡文本 3.Android雷达图(蜘蛛网图) 4.Android文本闪烁 5.Android绘制圆形进度条 6.重写TextView,实现圆形背景,文本居中显示

Android 自定义ViewGroup 实战篇 -&gt; 实现FlowLayout

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38352503 ,本文出自[张鸿洋的博客] 1.概述 上一篇已经基本给大家介绍了如何自定义ViewGroup,如果你还不了解,请查看:Android 手把手教您自定ViewGroup ,本篇将使用上篇介绍的方法,给大家带来一个实例:实现FlowLayout,何为FlowLayout,如果对Java的Swing比较熟悉的话一定不会陌生,就是控件根据ViewGroup的宽,自动的往右

(转载)Android自定义标签列表控件LabelsView解析

Android自定义标签列表控件LabelsView解析 作者 donkingliang 关注 2017.03.15 20:59* 字数 759 阅读 406评论 0喜欢 3 无论是在移动端的App,还是在前端的网页,我们经常会看到下面这种标签的列表效果: 标签列表 标签从左到右摆放,一行显示不下时自动换行.这样的效果用Android源生的控件很不好实现,所以往往需要我们自己去自定义控件.我在开发中就遇到过几次要实现这样的标签列表效果,所以就自己写了个控件,放到我的GitHub,方便以后使用.有

Android自定义view学习笔记02

Android自定义view学习笔记02 本文代码来自于张鸿洋老师的博客之Android 自定义View (二) 进阶 学习笔记,对代码进行些许修改,并补充一些在coding过程中遇到的问题.学习的新东西. 相关代码 //CustomImageView.java package mmrx.com.myuserdefinedview.textview; import android.content.Context; import android.content.res.TypedArray; im