您的位置:首页 > 移动开发 > Android开发

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

2015-05-15 00:15 591 查看
主要思想是用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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: