Android 转菊花控件:loading加载常用

主要思想是用mMatrix设置旋转中心和旋转角度,然后在onDraw(Canvas canvas) 中用canvas.drawBitmap(mForeBitmap, mMatrix, null) 画出图片;并且更新角度,调用postInvalidate(),反复循环触发onDraw(Canvas canvas) ,从而使图片动起来。

使用示例:

1. 在main_layout.xml 加入如下控件

<com.test.mytest.RotationLoadingView
    android:id="@+id/item_loading_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
</com.test.mytest.RotationLoadingView>
2. 在java 代码中调用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
        RotationLoadingView mItemLoadingImage = (RotationLoadingView) findViewById(R.id.item_loading_image);
        mItemLoadingImage.startRotationAnimation();
    }
3. RotationLoadingView.java

package com.test.mytest;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.drawable.BitmapDrawable;
import android.util.AttributeSet;
import android.view.View;

/**
 * 转菊花控件-->loading
 */
public class RotationLoadingView extends View {

	private Context mContext;
	private boolean mIsAnimation;
	private int rotate;
	private final int ROTATE_STEP = 10;
	private int mWidth;
	private int mHeight;
	/** 菊花 **/
	private Bitmap mForeBitmap;
	/** 旋转矩阵 **/
	private Matrix mMatrix = new Matrix();
	/** 是否逆时针转动,默认是 **/
	private boolean mClockwise = true;
	private PaintFlagsDrawFilter mPaintFlagsDrawFilter;

	/**
	 * 构造函数,初始化前景图片和背景图片
	 */
	public RotationLoadingView(Context context) {
		super(context);
		mContext = context;
		init();
	}

	public RotationLoadingView(Context context, AttributeSet attrs) {
		super(context, attrs);
		mContext = context;
		init();
	}

	/**
	 * 设置控件width、height
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		mWidth = mForeBitmap.getWidth();
		mHeight = mForeBitmap.getHeight();
		setMeasuredDimension(mWidth, mHeight);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 如果位图资源已经被回收,则再重新创建一次,然后再绘图
		if (mForeBitmap.isRecycled() && mIsAnimation) {
			init();
		}

		// 如果位图资源存在,则直接绘图
		if (!(mForeBitmap.isRecycled())) {
			// 设置旋转中心及旋转角度
			mMatrix.setRotate(rotate, mForeBitmap.getWidth() / 2, mForeBitmap.getHeight() / 2);
			// 消除canvas因图片旋转所产生的锯齿
			canvas.setDrawFilter(mPaintFlagsDrawFilter);
			canvas.drawBitmap(mForeBitmap, mMatrix, null); // 绘制前景图
			if (mIsAnimation) {
				rotate = rotate + ROTATE_STEP > 360 ? 0 : rotate + ROTATE_STEP;
				rotate = mClockwise ? rotate : -rotate;
				postInvalidate();
			}
		}
	}

	/** 开始动画 **/
	public void startRotationAnimation() {
		mIsAnimation = true;
		invalidate();
	}

	/** 停止动画 **/
	public void stopRotationAnimation() {
		mIsAnimation = false;
	}

	/**
	 * 覆盖父类方法 以免外部忘记调用stopRotationAnimation(), 导致内存泄漏
	 */
	protected void onDeAttachedToWindow() {
		stopRotationAnimation();
		super.onDetachedFromWindow();
	}

	private void init() {
		mPaintFlagsDrawFilter = new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
		mForeBitmap = ((BitmapDrawable) mContext.getResources().getDrawable(getResID())).getBitmap();
		invalidate();
	}
	
	private int getResID() {
	    return R.drawable.icon_dengdai;
	}
}
icon_dengdai.png


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值