今天实现了一个模拟碟片加载过程的小demo,在此展示一下。由于在公司,不好截取动态图片,因此就在这截取两张静态图片看看效果先。

下面简单的将代码列出来。

setp1、准备两张用于旋转的图片,如下:loading_disc.png是第一张图片,loading_light.png是第二张图片。

      (1)                  (2)

step2、自定义一个View,用来控制这两个图片的旋转。com.oyp.loadingdisk.LoadingDiscView.java

package com.oyp.loadingdisk;

import java.io.InputStream;

import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.view.View;
/**
* 自定义的View,用来显示加载的图片
* @author ouyangpeng
* @link http://blog.csdn.net/ouyang_peng
*
* <p>在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿。<br>
* 方法一:给Paint加上抗锯齿标志。然后将Paint对象作为参数传给canvas的绘制方法。<br>
* 如:mypaint.setAntiAlias(true);<p>
* 方法二:给Canvas加上抗锯齿标志。有些地方不能用paint的,就直接给canvas加抗锯齿,更方便。<br>
* 如:
* mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);<br>
* canvas.setDrawFilter(mSetfil);
*/
public class LoadingDiscView extends View {
private RefreshHandle refreshHandle;
private Context context;
/** 用于旋转的bitmap*/
private Bitmap m_bmp_disc = null;
private Matrix m_matrix_disc = new Matrix();
/** 用于展现高亮背景的bitmap*/
private Bitmap m_bmp_light = null;
private Matrix m_matrix_light = new Matrix();
/**Paint滤波器*/
private PaintFlagsDrawFilter mSetfil = null;
/**声明一个画笔*/
private Paint mypaint = null;
/**图像缩放比例*/
private float m_scale =1.0f;
/**图像旋转的速度*/
private float m_disc_rot_speed = 0;
/**图像旋转的状态*/
private int m_state_play = 1;
/**图像旋转的最大速度*/
private float m_disc_max = 20f; public void setRefreshHandle(RefreshHandle refreshHandle) {
this.refreshHandle = refreshHandle;
} public LoadingDiscView(Context context) {
super(context);
this.context = context;
mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);//设置画布绘图无锯齿
initBitmap();
} public boolean initBitmap() {
mypaint = new Paint();
//给Paint加上抗锯齿标志
mypaint.setAntiAlias(true);//画笔的抗锯齿(用于线条等) Resources res = context.getResources();
InputStream is = res.openRawResource(R.drawable.loading_disc);
m_bmp_disc = BitmapFactory.decodeStream(is);
matrixPostTranslate(m_matrix_disc,m_bmp_disc); is = res.openRawResource(R.drawable.loading_light);
m_bmp_light = BitmapFactory.decodeStream(is);
matrixPostTranslate(m_matrix_light,m_bmp_light);
return true;
}
/**
* 旋转图像
* @param matrix 控制旋转的矩阵
* @param bitmap 要旋转的图像
*/
private void matrixPostTranslate(Matrix matrix,Bitmap bitmap) {
int tmp_width = bitmap.getWidth();
int tmp_height = bitmap.getHeight();
matrix.postTranslate(-tmp_width / 2, -tmp_height / 2); //设置平移位置
matrix.postScale(m_scale, m_scale); //设置缩放比例
matrix.postTranslate(123 * m_scale, 146 * m_scale);
} protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//给Canvas加上抗锯齿标志
canvas.setDrawFilter(mSetfil);//图片线条(通用)的抗锯齿
canvas.drawBitmap(m_bmp_disc, m_matrix_disc, mypaint);
canvas.drawBitmap(m_bmp_light, m_matrix_light, mypaint);
} public void update() {
if (m_disc_rot_speed > 0.01 || m_state_play == 1){
if (m_state_play == 1 && m_disc_rot_speed<m_disc_max){
m_disc_rot_speed += (m_disc_max+0.5f-m_disc_rot_speed)/30;
}
else if (m_disc_rot_speed>0.1){
m_disc_rot_speed -= (m_disc_rot_speed)/40;
}
m_matrix_disc .postRotate(m_disc_rot_speed, 123*m_scale, 146*m_scale);
invalidate();
}
} public void onPause(){
refreshHandle.stop();
}
public void onResume(){
refreshHandle.run();
} }

step3、写一个Handler用来控制图片的旋转   com.oyp.loadingdisk.RefreshHandle.java

package com.oyp.loadingdisk;

import android.os.Handler;
import android.os.Message;
/**
* 用来发送消息和处理消息的
* @author ouyangpeng
* @link http://blog.csdn.net/ouyang_peng
*/
public class RefreshHandle extends Handler {
LoadingDiscView loadingDiscView; public RefreshHandle(LoadingDiscView loadingDiscView) {
this.loadingDiscView = loadingDiscView;
loadingDiscView.setRefreshHandle(this);
} public void run() {
loadingDiscView.update();
removeCallbacksAndMessages(null);
sendEmptyMessageDelayed(0, 65);
} public void stop() {
removeCallbacksAndMessages(null);
} @Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
run();
break;
}
}
}

step4、应用布局文件    res/layout/loading.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#382517"
tools:context=".MainActivity"
> <RelativeLayout
android:id="@+id/loading_disc"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/loading_disc"
android:paddingLeft="100dp"
>
</RelativeLayout> <RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="380dip" > <TextView
android:id="@+id/loading_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:singleLine="true"
android:textColor="#FFFFFF"
android:text="读碟中,请稍后 . . ."
android:textSize="20sp" />
</RelativeLayout>
</RelativeLayout>

step5、写一个Activity用来装载布局文件,并展示    com.oyp.loadingdisk.LoadingActivity.java

package com.oyp.loadingdisk;

import android.app.Activity;
import android.os.Bundle;
import android.widget.RelativeLayout;
/**
* @author ouyangpeng
* @link http://blog.csdn.net/ouyang_peng
*/
public class LoadingActivity extends Activity {
private RelativeLayout motionView;
private LoadingDiscView disc_motion;
private RefreshHandle refreshHandle; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.loading);
disc_motion = new LoadingDiscView(this);
refreshHandle = new RefreshHandle(disc_motion);
motionView = (RelativeLayout) findViewById(R.id.loading_disc);
motionView.addView(disc_motion);
refreshHandle.sendEmptyMessage(0);
}
@Override
protected void onResume() {
super.onResume();
disc_motion.onResume();
}
}

当然,这里只是模拟碟片加载过程,实际上可以对代码进行处理,使碟片加载过程完毕后,启动相应的界面来展示碟片中的视频、图像、音乐资源等,但是这里不便写出来。

关于源代码,您可以通过   https://github.com/ouyangpeng/LoadingDisk 来免费察看和下载代码

====================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址:http://blog.csdn.net/ouyang_peng

===================================================================================

我的Android进阶之旅------>Android通过使用Matrix旋转图片来模拟碟片加载过程的更多相关文章

  1. 我的Android进阶之旅------>Android颜色值(#AARRGGBB)透明度百分比和十六进制对应关系以及计算方法

    我的Android进阶之旅-->Android颜色值(RGB)所支持的四种常见形式 透明度百分比和十六进制对应关系表格 透明度 十六进制 100% FF 99% FC 98% FA 97% F7 ...

  2. 我的Android进阶之旅------>Android中查看应用签名信息

    一.查看自己的证书签名信息 如上一篇文章<我的Android进阶之旅------>Android中制作和查看自定义的Debug版本Android签名证书>地址:http://blog ...

  3. 我的Android进阶之旅------>Android利用温度传感器实现带动画效果的电子温度计

    要想实现带动画效果的电子温度计,需要以下几个知识点: 1.温度传感器相关知识. 2.ScaleAnimation动画相关知识,来进行水印刻度的缩放效果. 3.android:layout_weight ...

  4. 我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(三)Android客户端功能实现

    我的Android进阶之旅------>Android实现用Android手机控制PC端的关机和重启的功能(一)PC服务器端(地址:http://blog.csdn.net/ouyang_pen ...

  5. 我的Android进阶之旅------> Android为TextView组件中显示的文本添加背景色

    通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...

  6. 我的Android进阶之旅------> Android在TextView中显示图片方法

    面试题:请说出Android SDK支持哪些方式显示富文本信息(不同颜色.大小.并包含图像的文本信息),并简要说明实现方法. 答案:Android SDK支持如下显示富文本信息的方式. 1.使用Tex ...

  7. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)

    在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...

  8. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)

    正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...

  9. 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)

    对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...

随机推荐

  1. workflow engine Ruote初体验之三(条件与美元符号)

    条件 我们可以用:if和:unless公共属性来进行条件判断,或者使用if,given,once或者equals(已经过时)关键字. 使用:if属性: 1 cursor do 2 participan ...

  2. f5压缩

    F5应用加速 编辑 F5在4个方面对Web应用提速: 一降低网络传输的压力,最典型技术是压缩 F5的加速技术把100K的页面压缩到20K在广域网上传输,一些标准的浏览器如IE.火狐可以自动解压,这一过 ...

  3. Android Touch事件传递机制详解 上

    最近总是遇到关于Android Touch事件的问题,如:滑动冲突的问题,以前也花时间学习过Android Touch事件的传递机制,可以每次用起来的时候总是忘记了,索性自己总结一下写篇文章避免以后忘 ...

  4. ubuntu 配置L2tp出现的问题解决

    运行环境:ubuntu 14.04 64位 配置推荐网址: https://linux.cn/article-3409-1.html 首先,官方教程是必须的: https://help.ubuntu. ...

  5. 字符集研究之多字节字符集和unicode字符集

    作者:朱金灿 来源:http://blog.csdn.net/clever101 本文简介计算机中两大字符集:多字节字符集和unicode字符集的出现及关系. 首先我们须要明确的是计算机是怎样找到字符 ...

  6. Mockito使用指南

    转载请标明出处:http://blog.csdn.net/shensky711/article/details/52771493 本文出自: [HansChen的博客] mock和Mockito的关系 ...

  7. Linux下的定时任务Crontab

    通过crontab -e写入定时任务的指令,一行为一项任务. 任务模式是时间克龙表达式+命令形式. 如: 2 0,6,12,18 * * * perl /root/restarttomcat.pl p ...

  8. Linux是怎么启动的(整理)

    昨天笔试考了一道关于linux系统启动的过程,当时没答上来,现在整理出来(其实并不复杂). 按下电源按钮的直到欢迎页出来之后,linux总共做的事可以分为五步来完成. 1.  BIOS加电自检: 加电 ...

  9. 获取input光标的x和y轴

    http://blog.csdn.net/kingwolfofsky/article/details/6586029 index.html <!DOCTYPE html> <html ...

  10. NHibernate3剖析:Mapping篇之ConfORM实战(1):概览

    ORuM思想浮出 对于ORM(Object Relational Mapping)我们太熟悉了,可是我们从还有一个角度能够想象出ORuM(Object Relational un-Mapping)的思 ...