`

android rotate

 
阅读更多

rotate:fromDegrees:其实角度。toDegrees:旋转的角度。
translate:fromXDelta,fromYDelta:相当本视图左上角的X,Y坐标。toXDelta,toYDelta:移动后的X,Y坐标。
alpha:
  fromAlpha:起始的透光度、0为全透明,完全不可见;1为不透明,完全可见。
特别提醒:
  在Android内部,针对所有的变换,无论起始点是什么时候,其指定的起始值使用于动画开始时的相应属性值。
imageView.setAlpha(int alpha);

用于设置imageView的透明度,取值范围为1--255,1为透明,255为完全不透明。


package com.test.hsx;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.NinePatchDrawable;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。
 * 
 * @author Alan
 */
public class RoundImageView extends ImageView {
	private int mBorderThickness = 0;
	private Context mContext;
	private int defaultColor = 0xFFFFFFFF;
	// 如果只有其中一个有值,则只画一个圆形边框
	private int mBorderOutsideColor = 0;
	private int mBorderInsideColor = 0;
	// 控件默认长、宽
	private int defaultWidth = 0;
	private int defaultHeight = 0;

	public RoundImageView(Context context) {
		super(context);
		mContext = context;
	}

	public RoundImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		setCustomAttributes(attrs);
	}

	public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mContext = context;
		setCustomAttributes(attrs);
	}

	private void setCustomAttributes(AttributeSet attrs) {
		TypedArray a = mContext.obtainStyledAttributes(attrs, R.styleable.roundedimageview);
		mBorderThickness = a.getDimensionPixelSize(R.styleable.roundedimageview_border_thickness, 0);
		mBorderOutsideColor = a.getColor(R.styleable.roundedimageview_border_outside_color, defaultColor);
		mBorderInsideColor = a.getColor(R.styleable.roundedimageview_border_inside_color, defaultColor);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		Drawable drawable = getDrawable();
		if (drawable == null) {
			return;
		}

		if (getWidth() == 0 || getHeight() == 0) {
			return;
		}
		this.measure(0, 0);
		if (drawable.getClass() == NinePatchDrawable.class)
			return;
		Bitmap b = ((BitmapDrawable) drawable).getBitmap();
		Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
		if (defaultWidth == 0) {
			defaultWidth = getWidth();

		}
		if (defaultHeight == 0) {
			defaultHeight = getHeight();
		}
		// 保证重新读取图片后不会因为图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)
		// if (defaultWidth != 0 && defaultHeight != 0) {
		// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
		// defaultWidth, defaultHeight);
		// setLayoutParams(params);
		// }
		int radius = 0;
		if (mBorderInsideColor != defaultColor && mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - 2 * mBorderThickness;
			// 画内圆
			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
			// 画外圆
			drawCircleBorder(canvas, radius + mBorderThickness + mBorderThickness / 2, mBorderOutsideColor);
		} else if (mBorderInsideColor != defaultColor && mBorderOutsideColor == defaultColor) {// 定义画一个边框
			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderInsideColor);
		} else if (mBorderInsideColor == defaultColor && mBorderOutsideColor != defaultColor) {// 定义画一个边框
			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2 - mBorderThickness;
			drawCircleBorder(canvas, radius + mBorderThickness / 2, mBorderOutsideColor);
		} else {// 没有边框
			radius = (defaultWidth < defaultHeight ? defaultWidth : defaultHeight) / 2;
		}
		Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
		canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight / 2 - radius, null);
	}

	/**
	 * 获取裁剪后的圆形图片
	 * 
	 * @param radius
	 *            半径
	 */
	public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
		Bitmap scaledSrcBmp;
		int diameter = radius * 2;

		// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
		int bmpWidth = bmp.getWidth();
		int bmpHeight = bmp.getHeight();
		int squareWidth = 0, squareHeight = 0;
		int x = 0, y = 0;
		Bitmap squareBitmap;
		
		if (bmpHeight > bmpWidth) {// 高大于宽
			squareWidth = squareHeight = bmpWidth;
			x = 0;
			y = (bmpHeight - bmpWidth) / 2;
			// 截取正方形图片
			squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
		} 
		else if (bmpHeight < bmpWidth) {// 宽大于高
			squareWidth = squareHeight = bmpHeight;
			x = (bmpWidth - bmpHeight) / 2;
			y = 0;
			squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth, squareHeight);
		} else {
			squareBitmap = bmp;
		}

		if (squareBitmap.getWidth() != diameter || squareBitmap.getHeight() != diameter) {
			scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter, diameter, true);

		} else {
			scaledSrcBmp = squareBitmap;
		}
		
		
		Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight(), Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		Paint paint = new Paint();
		Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(), scaledSrcBmp.getHeight());

		paint.setAntiAlias(true);
		paint.setFilterBitmap(true);
		paint.setDither(true);
		canvas.drawARGB(0, 0, 0, 0);
		canvas.drawCircle(scaledSrcBmp.getWidth() / 2, scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2, paint);
		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
		// bitmap回收(recycle导致在布局文件XML看不到效果)
		// bmp.recycle();
		// squareBitmap.recycle();
		// scaledSrcBmp.recycle();
		bmp = null;
		squareBitmap = null;
		scaledSrcBmp = null;
		return output;
	}

	/**
	 * 边缘画圆
	 */
	private void drawCircleBorder(Canvas canvas, int radius, int color) {
		Paint paint = new Paint();
		/* 去锯齿 */
		paint.setAntiAlias(true);
		paint.setFilterBitmap(true);
		paint.setDither(true);
		paint.setColor(color);
		/* 设置paint的 style 为STROKE:空心 */
		paint.setStyle(Paint.Style.STROKE);
		/* 设置paint的外框宽度 */
		paint.setStrokeWidth(mBorderThickness);
		canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
	}

}


Bitmap.createBitmap函数有6个重载方法
引用
public static Bitmap createBitmap (Bitmap src)
从原位图src复制出一个新的位图,和原始位图相同

public static Bitmap createBitmap (int[] colors, int width, int height, Bitmap.Config config)
这个函数根据颜色数组来创建位图,注意:颜色数组的长度>=width*height

此函数创建位图的过程可以简单概括为为:更加width和height创建空位图,然后用指定的颜色数组colors来从左到右从上至下一次填充颜色。config是一个枚举,可以用它来指定位图“质量”。

public static Bitmap createBitmap (int[] colors, int offset, int stride, int width, int height, Bitmap.Config config)
此方法与2类似,但我还不明白offset和stride的作用。

public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)
从原始位图剪切图像,这是一种高级的方式。可以用Matrix(矩阵)来实现旋转等高级方式截图
参数说明:
  Bitmap source:要从中截图的原始位图
  int x:起始x坐标
  int y:起始y坐标
int width:要截的图的宽度
int height:要截的图的宽度
Bitmap.Config  config:一个枚举类型的配置,可以定义截到的新位图的质量
返回值:返回一个剪切好的Bitmap
public static Bitmap createBitmap (int width, int height, Bitmap.Config config)
根据参数创建新位图

public static Bitmap createBitmap (Bitmap source, int x, int y, int width, int height)
简单的剪切图像的方法
0
0
分享到:
评论

相关推荐

    android Rotate3D12-11-20源码.zip

    "android Rotate3D12-11-20源码.zip" 包含了一个关于如何在Android平台上实现3D旋转动画的源代码示例。这个压缩包中的"Rotate3D"文件可能是主项目目录,包含了一系列相关的Java类和资源文件,用于演示3D旋转的实现。...

    Android动画效果translate、scale、alpha、rotate详解

    "Android 动画效果translate、scale、alpha、rotate详解" Android 动画效果可以分为四种类型:translate、scale、alpha、rotate,每种类型都有其特点和应用场景。 一、translate 动画效果 translate 动画效果是...

    Android-Rotate3D是一个3D旋转动画库

    Android开发中的3D旋转动画库,如"Rotate3D",是实现动态视觉效果的重要工具。这个库专门设计用于在Android平台上创建引人入胜、立体感十足的3D旋转动画,极大地丰富了用户界面的交互体验。在移动应用开发中,尤其是...

    Android_rotate--animation.zip_Android 动画_android_android animati

    本资源“Android_rotate--animation.zip”似乎聚焦于视图动画中的旋转效果,特别是如何在两个图片之间平滑地进行旋转过渡,同时解决动画过程中的锯齿问题。 首先,我们要理解Android中的视图动画。视图动画在API...

    android应用源码动画效果 translate、scale、alpha、rotate 切换Activity动画.zip

    此外,压缩包中的"源码说明.txt"可能包含更详细的代码实现和使用说明,"Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整"可能是示例代码或教程文档,帮助开发者更好地理解和实现...

    android 的y轴旋转动画

    &lt;rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="90" android:pivotX="50%" android:pivotY="50%" android:duration="2000" android:...

    android实现文字跳动

    在Android平台上,实现文字跳动的效果可以为用户界面增添动态感和趣味性,尤其是在加载等待、提示信息等场景中。这种动画效果通常采用自定义View或者利用现有库来完成。本教程将深入探讨如何在Android中实现文字跳动...

    android_view_rotate

    "android_view_rotate"这个主题就是关于如何在Android中实现控件的旋转功能,包括手动拖拽旋转和自动旋转。下面我们将深入探讨相关的知识点。 首先,Android中的动画分为两种类型:属性动画(Property Animation)...

    Android使用Rotate3dAnimation实现3D旋转动画效果的实例代码

    Android 使用 Rotate3dAnimation 实现 3D 旋转动画效果的实例代码 Android 平台提供了 Rotate3dAnimation 类,用于实现 3D 旋转动画效果。Rotate3dAnimation 是一个继承自 Animation 的类,用于围绕 Y 轴进行旋转,...

    Android单帧动画Rotate旋转

    在res/anim目录下创建一个名为rotate_loading.xml的文件,内容如下: ```xml &lt;animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"&gt; android:drawable="@...

    Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍

    &lt;rotate android:fromDegrees="0" android:toDegrees="359" android:duration="500" android:repeatCount="-1" android:pivotX="50%" android:pivotY="50%" /&gt; ``` 这个动画定义了从0度开始,旋转到359度,...

    Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整.zip

    在Android应用开发中,动画效果是提升用户体验的关键因素之一。本项目主要涵盖了四种基本的动画类型:translate(平移)、scale(缩放)、alpha(透明度变化)和rotate(旋转),并展示了如何将它们应用于Activity的...

    Android编程画图之抗锯齿解决方法

    在Android编程中,进行图形绘制时,经常遇到的一个问题是图像边缘出现锯齿现象,尤其是在进行旋转、缩放等操作后,这种现象更为明显。锯齿是由于像素渲染不完全导致的,影响了图像的视觉效果。为了解决这个问题,...

    Android代码-rotate-layout

    Rotate Layout Custom layout that can rotate it's view Usage In your layout file add &lt;!-- Specify rotate angle here --&gt; Voila! Your layout will be rotated 90 degrees. Download compile '...

    Android动画效果 translate、scale、alpha、rotate 切换Activity动画

    Android提供了多种动画类型,其中包括translate(平移)、scale(缩放)、alpha(透明度)和rotate(旋转)这四种基本动画。这些动画可以单独使用,也可以组合起来创建复杂的过渡效果。本教程将深入探讨这四种动画在...

    13套安卓源码合集Android应用源码.zip

    android应用源码动画效果 translate、scale、alpha、rotate 切换Activity动画.rar android应用源码可以报警的手电.rar android应用源码图片浏览器完整无BUG.rar android应用源码局域网视频聊天.rar android应用源码...

    安卓Android源码——Rotate3D12-11-20.zip

    "安卓Android源码——Rotate3D12-11-20.zip"这个压缩包文件显然包含了与3D旋转相关的源代码,可能是一个Android项目的特定模块或示例。在这里,我们将详细探讨Android系统中的3D旋转动画以及与之相关的技术点。 ...

    Android动画效果 translate、scale、alpha、rotate-IT计算机-毕业设计.zip

    这个毕业设计的源码Demo主要展示了Android中的四种基本动画:translate(平移)、scale(缩放)、alpha(透明度变化)和rotate(旋转)。这些动画可以用于创建动态的界面过渡、用户交互反馈以及丰富的视觉效果。下面...

Global site tag (gtag.js) - Google Analytics