热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

自定义TextView实现内容的旋转和偏移

在一些设计上,设计师会要求我们的文字以45度显示,或者135度显示(如下图“抽奖”),可是android本身并没有提供TextView在布局文件中实现旋

在一些设计上,设计师会要求我们的文字以45度显示,或者135度显示(如下图“抽奖”),可是android本身并没有提供TextView在布局文件中实现旋转的标签,这时候就需要我们去自定义TextView,并且重写onDraw()方法实现效果。


下面,让我们去实现这个效果吧。


首先我们熟悉一下android view坐标系,android采用的X,Y横纵坐标系,X轴向右为正方向,Y轴向下为正方向,旋转方向为顺时针,如下图。


默认我们的文字是在TextView左上角显示的,我们要旋转的也就是这个文字,而文字绘制的时候也是有一个范围的,例如下图,文字外面我标识出来的方框。而我们的操作的都是以TextView坐标系的原点进行移动和旋转。


这样我们就确定我们要进行的操作,针对onDraw()对canvas进行translate(移动)或者rotate(旋转)操作坐标系,这里要说明的一点是,按我的习惯来,肯定是先进行偏移再进行旋转,旋转后的坐标系,想必你看着也会很难受吧。


下面是我重写的TextView的代码和效果图以及布局中的使用。我在Xml中自定义了标签,但是没有对标签内容进行约束,因为比较懒。。

package com.example.rtv;

import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

/**
* text旋转的textview
* @author Kenneth
*
*/
public class RotateTextView extends TextView {
private static final String NAME_SPACE = "http://www.baidu.com/apk/res/custom";

private static final String ATTR_ROTATE = "rotate";
private static final int DEFAULT_VALUE_ROTATE = 0;


private static final String ATTR_TRANSLATE_X= "translateX";
private static final String ATTR_TRANSLATE_Y = "translateY";
private static final float DEFAULT_VALUE_TRANSLATE_X = 0f;
private static final float DEFAULT_VALUE_TRANSLATE_Y = 0f;

private int rotate = DEFAULT_VALUE_ROTATE;

private float translateX = DEFAULT_VALUE_TRANSLATE_X;
private float translateY = DEFAULT_VALUE_TRANSLATE_Y;

public RotateTextView(Context context, AttributeSet attrs) {
super(context, attrs);
rotate = attrs.getAttributeIntValue(NAME_SPACE, ATTR_ROTATE, DEFAULT_VALUE_ROTATE);//旋转度数

translateX = attrs.getAttributeFloatValue(NAME_SPACE, ATTR_TRANSLATE_X, DEFAULT_VALUE_TRANSLATE_X);//获取在布局中的x轴偏移百分比
translateY = attrs.getAttributeFloatValue(NAME_SPACE, ATTR_TRANSLATE_Y, DEFAULT_VALUE_TRANSLATE_Y);//获取在布局中的y轴偏移百分比
}

@Override
protected void onDraw(Canvas canvas) {
canvas.translate(getMeasuredWidth()*translateX, getMeasuredHeight()*translateY);
//首先偏移在旋转,是因为,如果先旋转,本身xy坐标系也会跟着旋转,之后在偏移会不方便我们的控制,也不直观
canvas.rotate(rotate);
super.onDraw(canvas);
}

}

    xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://www.baidu.com/apk/res/custom"
android:layout_
android:layout_
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:cOntext="com.example.rtv.MainActivity$PlaceholderFragment" >

android:id="@+id/rotateTextView1"
android:layout_
android:layout_
android:layout_centerInParent="true"
android:text="@string/hello_world"
custom:rotate="45" />

android:id="@+id/rotateTextView2"
android:layout_
android:layout_
android:layout_alignLeft="@+id/rotateTextView1"
android:layout_alignParentTop="true"
android:text="@string/hello_world"
custom:rotate="135"
custom:translateX="1" />

android:id="@+id/rotateTextView3"
android:layout_
android:layout_
android:layout_alignLeft="@+id/rotateTextView1"
android:layout_alignParentBottom="true"
android:text="@string/hello_world"
custom:rotate="135"
custom:translateX="0.5"
custom:translateY="0.5" />

android:id="@+id/textView1"
android:layout_
android:layout_
android:layout_alignBaseline="@+id/rotateTextView2"
android:layout_alignBottom="@+id/rotateTextView2"
android:layout_toRightOf="@+id/rotateTextView2"
android:text="向X轴正方向偏移100%,旋转135°" />

android:id="@+id/textView2"
android:layout_
android:layout_
android:layout_alignTop="@+id/rotateTextView1"
android:layout_marginTop="14dp"
android:layout_toRightOf="@+id/rotateTextView1"
android:text="原地不动,旋转45°" />

android:id="@+id/textView3"
android:layout_
android:layout_
android:layout_alignTop="@+id/rotateTextView3"
android:layout_marginTop="15dp"
android:layout_toRightOf="@+id/rotateTextView3"
android:text="x轴y轴偏移50%,旋转135°" />

android:id="@+id/RotateTextView01"
android:layout_
android:layout_
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="@string/hello_world"
/>




推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
author-avatar
手机用户2602900871
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有