`

Android 画布的旋转

阅读更多
有时候我们会遇到这样的情况:一些字需要从下到上竖着显示怎么办?你会想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
分享到:
评论

相关推荐

    Android-3D自动旋转的旋转木马

    1. **布局设计**:首先,在XML布局文件中,我们需要一个可以承载3D视图的容器,通常是一个自定义的`GLSurfaceView`,这将作为旋转木马的画布。 2. **模型创建**:每个“旋转木马上的马匹”(即要展示的元素)都是一...

    android画布测试APK源码

    Android画布(Canvas)是Android系统中用于图形绘制的核心组件,它是Android图形系统的重要组成部分,允许开发者在Bitmap、SurfaceView或者其他可绘图对象上绘制各种形状、文本和图像。CanvasTest APK源码提供了对...

    Android-可以缩放的画布

    在Android开发中,"可以缩放的画布"是一个重要的技术概念,特别是在处理图像加载和展示时。Android的Canvas类提供了基本的绘图功能,但默认情况下,它并不支持缩放。为了实现可缩放的画布,开发者通常需要利用Matrix...

    android 画布 涂鸦 源代码

    在Android开发中,"画布(Canvas)"是用于图形绘制的核心组件,它是Android视图(View)系统的一部分,允许开发者在屏幕上绘制自定义图形。"涂鸦(Drawing)"是指用户通过触摸屏或手写笔在屏幕上自由地绘制线条、形状等。...

    android canvas 3D旋转木马 图片立体展示

    总的来说,"android canvas 3D旋转木马 图片立体展示"是一个结合了Android图形编程、动画技术和用户交互的复杂项目。它需要开发者具备扎实的数学基础、良好的编程技巧以及对Android系统理解的深度。通过学习和实践这...

    android应用源码图片放大缩小旋转涂鸦源码.zip

    在Android平台上,开发一款能够实现图片放大、缩小、旋转以及涂鸦功能的应用是常见的需求,这对于用户交互和图像处理有着重要的意义。这份"android应用源码图片放大缩小旋转涂鸦源码.zip"提供了完整的源代码,可以...

    Android 圆形旋转菜单

    在Android开发中,创建独特和吸引用户的交互设计是至关重要的,"Android 圆形旋转菜单"就是一个这样的设计。这种菜单通常用于实现一种动态且有趣的用户界面元素,它默认包含6个按钮,用户可以通过手势滑动来触发菜单...

    Android中轴旋转特效实现,制作别样的图片浏览器

    在Android开发中,创建独特的用户体验往往需要利用各种视觉特效,其中一种吸引人的特效就是图片的中轴旋转。本文将深入探讨如何在Android中实现轴旋转特效,以制作一个别样的图片浏览器。 首先,我们需要理解“中轴...

    Android应用源码之Android圆形旋转菜单CircleMenu.zip

    在Android中,我们可以利用Paint对象进行图形绘制,Canvas提供画布进行图形渲染。通过onDraw()方法,开发者可以控制菜单项的大小、颜色以及旋转动画的效果。 菜单项的旋转动画通常是通过ObjectAnimator或者...

    Android自定义画布及环形菜单

    在Android开发中,自定义画布(Canvas)和环形菜单(RingMenu)是实现独特交互和视觉效果的重要技术。接下来我们将深入探讨这些知识点,并提供详细的实现步骤。 首先,我们来了解一下自定义画布。在Android中,...

    Android应用源码之(Canvas画布).zip

    这个"Android应用源码之(Canvas画布).zip"文件很可能包含了一些示例代码,帮助开发者理解如何使用Canvas进行图形绘制。在本文中,我们将深入探讨Canvas的基本概念、常用方法以及在实际开发中的应用场景。 Canvas是...

    android圆形旋转菜单,并支持移动换位功能

    "android圆形旋转菜单,并支持移动换位功能"是一个创新的交互设计,旨在为用户提供有趣且直观的操作方式。这种菜单通常用于显示多个选项,用户可以通过手势或点击来旋转菜单,选择不同的功能。接下来,我们将深入...

    Android Canvas画布使用Demo源码.rar

    - `rotate()`: 旋转画布,指定旋转角度。 - `skew()`: 扭曲画布,沿着X轴和Y轴倾斜。 8. **保存和恢复状态** - `save()`: 保存当前Canvas的状态,包括坐标变换、绘图样式等。 - `restore()`: 恢复到之前保存的...

    Android应用源码之(旋转关节).zip

    在源码中,开发者可能会创建一个Matrix实例,然后调用其setRotate()方法来设置旋转角度,再用applyToCanvas()方法将这个旋转应用到画布上。同时,为了实现动态旋转,可能还会在onTouchEvent()事件处理方法中根据用户...

    安卓Android源码——(Canvas画布).rar

    这份“安卓Android源码——(Canvas画布).rar”压缩包很可能是包含了一些关于Canvas使用的源代码示例或者解析,帮助我们深入理解Android图形绘制的底层机制。 Canvas是Android中的一个类,它允许开发者通过调用其...

    安卓旋转按钮eclipse

    在这个项目中,旋转按钮可能通过画布(Canvas)上的线条、圆弧等基本图形来构建出旋转开关的视觉效果。同时,为了实现旋转按钮的点击和滑动事件,我们需要实现`OnClickListener`和`OnTouchListener`接口。 点击事件...

    Android使用RotateImageView 旋转ImageView

    在onDraw()中,我们可以先调用父类的`super.onDraw(canvas)`来绘制原始的ImageView内容,然后使用Canvas提供的旋转方法`canvas.rotate(_degree, _x, _y)`,将画布绕着指定的旋转中心(_x_, _y_)旋转指定的角度(_...

    图片圆圈旋转 android

    根据给定的文件信息,我们可以深入探讨Android平台上实现图片圆圈旋转的相关知识点,这涉及到图形处理、自定义视图以及动画技术。 ### 图片圆圈旋转的原理与实现 在Android开发中,实现图片的圆圈旋转效果通常涉及...

    Android——实现光点模糊渐变的自旋转圆环特效,实现水滴波纹特效

    总结起来,实现光点模糊渐变的自旋转圆环特效和水滴波纹特效,需要对Android自定义View、动画系统、图形绘制有深入的理解。通过熟练掌握这些技术,开发者可以创造出更多富有创意和吸引力的UI效果,提升应用的整体...

    android大漩涡图片展示

    实现大漩涡动画,开发者可能使用了`ValueAnimator`或`ObjectAnimator`来改变图片的位置、大小、透明度等属性,形成旋转和收缩的视觉效果。同时,为了实现连续不断的涡流运动,可能需要设置动画的重复模式。例如: `...

Global site tag (gtag.js) - Google Analytics