有时候我们会遇到这样的情况:一些字需要从下到上竖着显示怎么办?你会想textview是否有这样的属性设置呢?很不幸的是,并不存在这样方便的属性,你必须自己定义一个view才能符合这一的要求。那如何实现呢?在我们从在重载一个view的时候,都会在onDraw的时候做自己想做的事情,那么我们在这个函数里面将画布进行旋转-90度就可以得到这样的效果,因为此时屏幕的坐标(0,0)点由左上角变成左下角,而系统画东西都是根据原点坐标来画的,这样选择以后的坐标系统(x1,y1)与原来的坐标系统(x0,y0)的对应关系是(x1=-y0,y1=x0),若旋转90度,那就是(x1=-y0,y1=-x0).
/*
* Copyright (C) 2007 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.android.apis.view;
// Need the following import to get access to the app resources, since this
// class is in a sub-package.
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;
import com.example.android.apis.R;
/**
* Example of how to write a custom subclass of View. LabelView is used to draw
* simple text views. Note that it does not handle styled text or right-to-left
* writing systems.
*
*/
public class LabelView extends View {
private Paint mTextPaint;
private String mText;
private int mAscent;
/**
* Constructor. This version is only needed if you will be instantiating the
* object manually (not from a layout XML file).
*
* @param context
*/
public LabelView(Context context) {
super(context);
initLabelView();
}
/**
* Construct object, initializing with any attributes we understand from a
* layout file. These attributes are defined in
* SDK/assets/res/any/classes.xml.
*
* @see android.view.View#View(android.content.Context,
* android.util.AttributeSet)
*/
public LabelView(Context context, AttributeSet attrs) {
super(context, attrs);
initLabelView();
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.LabelView);
CharSequence s = a.getString(R.styleable.LabelView_text);
if (s != null) {
setText(s.toString());
}
// Retrieve the color(s) to be used for this view and apply them.
// Note, if you only care about supporting a single color, that you
// can instead call a.getColor() and pass that to setTextColor().
setTextColor(a.getColor(R.styleable.LabelView_textColor, 0xFF000000));
int textSize = a.getDimensionPixelOffset(
R.styleable.LabelView_textSize, 0);
if (textSize > 0) {
setTextSize(textSize);
}
a.recycle();
}
private final void initLabelView() {
mTextPaint = new Paint();
mTextPaint.setAntiAlias(true);
mTextPaint.setTextSize(16);
mTextPaint.setColor(0xFF000000);
setPadding(3, 3, 3, 3);
}
/**
* Sets the text to display in this label
*
* @param text
* The text to display. This will be drawn as one line.
*/
public void setText(String text) {
mText = text;
requestLayout();
invalidate();
}
/**
* Sets the text size for this label
*
* @param size
* Font size
*/
public void setTextSize(int size) {
mTextPaint.setTextSize(size);
requestLayout();
invalidate();
}
/**
* Sets the text color for this label.
*
* @param color
* ARGB value for the text
*/
public void setTextColor(int color) {
mTextPaint.setColor(color);
invalidate();
}
/**
* @see android.view.View#measure(int, int)
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(measureWidth(widthMeasureSpec),
measureHeight(heightMeasureSpec));
}
/**
* Determines the width of this view
*
* @param measureSpec
* A measureSpec packed into an int
* @return The width of the view, honoring constraints from measureSpec
*/
private int measureWidth(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
if (specMode == MeasureSpec.EXACTLY) {
// We were told how big to be
result = specSize;
} else {
// Measure the text
result = (int) mTextPaint.measureText(mText) + getPaddingLeft()
+ getPaddingRight();
if (specMode == MeasureSpec.AT_MOST) {
// Respect AT_MOST value if that was what is called for by
// measureSpec
result = Math.min(result, specSize);
}
}
return result;
}
/**
* Determines the height of this view
*
* @param measureSpec
* A measureSpec packed into an int
* @return The height of the view, honoring constraints from measureSpec
*/
private int measureHeight(int measureSpec) {
int result = 0;
int specMode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
mAscent = (int) mTextPaint.ascent();
if (specMode == MeasureSpec.EXACTLY) {
// We were told how big to be
result = specSize;
} else {
// Measure the text (beware: ascent is a negative number)
result = (int) (-mAscent + mTextPaint.descent()) + getPaddingTop()
+ getPaddingBottom();
if (specMode == MeasureSpec.AT_MOST) {
// Respect AT_MOST value if that was what is called for by
// measureSpec
result = Math.min(result, specSize);
}
}
return result;
}
/**
* Render the text
*
* @see android.view.View#onDraw(android.graphics.Canvas)
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// not rotate
// canvas.drawText(mText, 200, 500, mTextPaint);
// rotate 90
canvas.rotate(90);
canvas.drawText(mText, 500, -200, mTextPaint);
// rotate -90
// canvas.rotate(-90);
// canvas.drawText(mText, -500, 200, mTextPaint);
}
}
- 大小: 9.8 KB
- 大小: 11.2 KB
- 大小: 11.2 KB
分享到:
相关推荐
1. **布局设计**:首先,在XML布局文件中,我们需要一个可以承载3D视图的容器,通常是一个自定义的`GLSurfaceView`,这将作为旋转木马的画布。 2. **模型创建**:每个“旋转木马上的马匹”(即要展示的元素)都是一...
Android画布(Canvas)是Android系统中用于图形绘制的核心组件,它是Android图形系统的重要组成部分,允许开发者在Bitmap、SurfaceView或者其他可绘图对象上绘制各种形状、文本和图像。CanvasTest APK源码提供了对...
在Android开发中,"可以缩放的画布"是一个重要的技术概念,特别是在处理图像加载和展示时。Android的Canvas类提供了基本的绘图功能,但默认情况下,它并不支持缩放。为了实现可缩放的画布,开发者通常需要利用Matrix...
在Android开发中,"画布(Canvas)"是用于图形绘制的核心组件,它是Android视图(View)系统的一部分,允许开发者在屏幕上绘制自定义图形。"涂鸦(Drawing)"是指用户通过触摸屏或手写笔在屏幕上自由地绘制线条、形状等。...
总的来说,"android canvas 3D旋转木马 图片立体展示"是一个结合了Android图形编程、动画技术和用户交互的复杂项目。它需要开发者具备扎实的数学基础、良好的编程技巧以及对Android系统理解的深度。通过学习和实践这...
在Android平台上,开发一款能够实现图片放大、缩小、旋转以及涂鸦功能的应用是常见的需求,这对于用户交互和图像处理有着重要的意义。这份"android应用源码图片放大缩小旋转涂鸦源码.zip"提供了完整的源代码,可以...
在Android开发中,创建独特和吸引用户的交互设计是至关重要的,"Android 圆形旋转菜单"就是一个这样的设计。这种菜单通常用于实现一种动态且有趣的用户界面元素,它默认包含6个按钮,用户可以通过手势滑动来触发菜单...
在Android开发中,创建独特的用户体验往往需要利用各种视觉特效,其中一种吸引人的特效就是图片的中轴旋转。本文将深入探讨如何在Android中实现轴旋转特效,以制作一个别样的图片浏览器。 首先,我们需要理解“中轴...
在Android中,我们可以利用Paint对象进行图形绘制,Canvas提供画布进行图形渲染。通过onDraw()方法,开发者可以控制菜单项的大小、颜色以及旋转动画的效果。 菜单项的旋转动画通常是通过ObjectAnimator或者...
在Android开发中,自定义画布(Canvas)和环形菜单(RingMenu)是实现独特交互和视觉效果的重要技术。接下来我们将深入探讨这些知识点,并提供详细的实现步骤。 首先,我们来了解一下自定义画布。在Android中,...
这个"Android应用源码之(Canvas画布).zip"文件很可能包含了一些示例代码,帮助开发者理解如何使用Canvas进行图形绘制。在本文中,我们将深入探讨Canvas的基本概念、常用方法以及在实际开发中的应用场景。 Canvas是...
"android圆形旋转菜单,并支持移动换位功能"是一个创新的交互设计,旨在为用户提供有趣且直观的操作方式。这种菜单通常用于显示多个选项,用户可以通过手势或点击来旋转菜单,选择不同的功能。接下来,我们将深入...
- `rotate()`: 旋转画布,指定旋转角度。 - `skew()`: 扭曲画布,沿着X轴和Y轴倾斜。 8. **保存和恢复状态** - `save()`: 保存当前Canvas的状态,包括坐标变换、绘图样式等。 - `restore()`: 恢复到之前保存的...
在源码中,开发者可能会创建一个Matrix实例,然后调用其setRotate()方法来设置旋转角度,再用applyToCanvas()方法将这个旋转应用到画布上。同时,为了实现动态旋转,可能还会在onTouchEvent()事件处理方法中根据用户...
这份“安卓Android源码——(Canvas画布).rar”压缩包很可能是包含了一些关于Canvas使用的源代码示例或者解析,帮助我们深入理解Android图形绘制的底层机制。 Canvas是Android中的一个类,它允许开发者通过调用其...
在这个项目中,旋转按钮可能通过画布(Canvas)上的线条、圆弧等基本图形来构建出旋转开关的视觉效果。同时,为了实现旋转按钮的点击和滑动事件,我们需要实现`OnClickListener`和`OnTouchListener`接口。 点击事件...
在onDraw()中,我们可以先调用父类的`super.onDraw(canvas)`来绘制原始的ImageView内容,然后使用Canvas提供的旋转方法`canvas.rotate(_degree, _x, _y)`,将画布绕着指定的旋转中心(_x_, _y_)旋转指定的角度(_...
根据给定的文件信息,我们可以深入探讨Android平台上实现图片圆圈旋转的相关知识点,这涉及到图形处理、自定义视图以及动画技术。 ### 图片圆圈旋转的原理与实现 在Android开发中,实现图片的圆圈旋转效果通常涉及...
总结起来,实现光点模糊渐变的自旋转圆环特效和水滴波纹特效,需要对Android自定义View、动画系统、图形绘制有深入的理解。通过熟练掌握这些技术,开发者可以创造出更多富有创意和吸引力的UI效果,提升应用的整体...
实现大漩涡动画,开发者可能使用了`ValueAnimator`或`ObjectAnimator`来改变图片的位置、大小、透明度等属性,形成旋转和收缩的视觉效果。同时,为了实现连续不断的涡流运动,可能需要设置动画的重复模式。例如: `...