今天实现了一个模拟碟片加载过程的小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. 转:ospf学习-----SPF最短路径算法

    ospf学习-----SPF最短路径算法 常见的路由协议比如RIP.IGRP.BGP是距离矢量协议,OSPF和ISIS是数据链路状态协议.矢量协议路由器只知道本身和与自身相连的接口路由信息,矢量图只是 ...

  2. 转:GEF 英文全称Graphical Editor Framework

    http://blog.csdn.net/chancein007/article/category/2713827

  3. 使用ssh从外网访问内网

    一.场景如下: 各个角色的对应关系如下: 角色 描述 APP 个人笔记本,属于内网IP sshd server 公网 VPS ( 映射端口: port 2222 ),拥有公网IP ssh client ...

  4. EasyMvc入门教程-图形控件说明(21)线形图+柱状图+饼形图

    本章将介绍一些基本但常用的图形:线型图,柱状图和饼形图. 以上三种图形对于的数据都是键值对数组,请参考第一个例子: @{ var data = new List<LineItem>(); ...

  5. Usage of API documented as @since1.6+

    Usage of API documented as @since1.6+ File ->Project Structure->Project Settings -> Modules ...

  6. NYOJ92 图像实用区域 【BFS】

    碰到了一个曾经从未见过的奇怪问题:先上截图: 执行号 用户 题目 结果 时间 内存 语言 提交时间 895360 userid=%E9%95%BF%E6%9C%A8" style=" ...

  7. MySQL具体解释(14)----------事务处理

    前言:前一篇文章关于事务处理的博文没有写清楚,读起来非常晦涩.非常难理解,所以有整理了一些资料,帮助理解.见谅! 关于MySQL事务处理学习记 START TRANSACTION COMMIT ROL ...

  8. MFC的运行机理分析+ASC码问题

    Win32程序是从WinMain开始执行的,但是MFC把WinMain给封装了,不会出现在你的代码里面,他已经编译到mfc80.dll了(VS2005)了. 在MFC中的执行顺序是这样的,首先Wind ...

  9. GroupBox与Panel控件

    1.GroupBox控件常常用于逻辑地组合一组控件,如RadioButton 及 CheckBox控件,显示一个框架,其上有一个标题. 2.Panel 可以包含多个控件,以便将这些控件编为一组,以便方 ...

  10. nginx+keepalived实现双机热备高可用性

    搭建准备: 机器两台 ip分别为192.168.100.128 192.168.100.129(能够用虚拟机測试.虚拟机网络模式为NET模式.且为静态ip) 另外须要准备一个虚拟ip对外提供服务.即通 ...