Android使用Matrix旋转图片模拟碟片加载过程

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

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

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

    

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 来免费察看和下载代码。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android实现对图片放大、平移和旋转的功能

    先来看看要实现的效果图 在讲解中,需要大家提前了解一些关于图片绘制的原理的相关知识. 关于实现的流程 1.自定义View 2.获得操作图片的Bitmap 3.复写View的onTouchEvent()方法中的ACTION_DOWN,ACTION_POINTER_DOWN,ACTION_MOVE,ACTION_POINTER_UP以及ACTION_UP事件. 4.定义相应图片变化的Matrix矩阵,通过手势操作的变化来设置相应的Matrix. 5.完成最终的Matrix设置时,通过invalida

  • Android单点触控实现图片平移、缩放、旋转功能

    相信大家使用多点对图片进行缩放,平移的操作很熟悉了,大部分大图的浏览都具有此功能,有些app还可以对图片进行旋转操作,QQ的大图浏览就可以对图片进行旋转操作,大家都知道对图片进行缩放,平移,旋转等操作可以使用Matrix来实现,Matrix就是一个3X3的矩阵,对图片的处理可分为四个基础变换操作,Translate(平移变换).Rotate(旋转变换).Scale (缩放变换).Skew(错切变换),如果大家对Matrix不太了解的话可以看看这篇文章(点击查看),作者对每一种Matrix的变换写

  • 基于Android 实现图片平移、缩放、旋转同时进行

    前言 之前因为项目需求,其中使用到了图片的单击显示取消,图片平移缩放功能,昨天突然想再加上图片的旋转功能,在网上看了很多相关的例子,可是没看到能同时实现我想要的功能的. 需求: (1)图片平移.缩放.旋转等一系列操作后,图片需要自动居中显示. (2)图片旋转后选自动水平显示或者垂直显示 (3)图片在放大缩小的同时都能旋转 Demo实现部分效果截图 Demo主要代码 Java MainActivity.java package com.practice.noyet.rotatezoomimagev

  • Android实现旋转,放大,缩小图片的方法

    本文实例讲述了Android实现旋转,放大,缩小图片的方法.分享给大家供大家参考,具体如下: 项目中需要做到一个预览图片的功能 最初设想自定义个一个view,在onDraw中用的是生成新的Bitmap,来放大,缩小 但由于手机内存是有限制的,在放大几倍以后,就会core掉. 后面直接选用imageview来完成此项任务,很遗憾,虽然不会重复生成bitmap导致core掉,但是imageview的大小限制是图片无法再放大或放大也只能在这个区域中. 最后选定用 当然  Drawable来做了 pri

  • Android 图片缩放与旋转的实现详解

    本文使用Matrix实现Android实现图片缩放与旋转.示例代码如下: 复制代码 代码如下: package com.android.matrix;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable

  • android图片处理之让图片一直匀速旋转

    本文是在我的文章android图片处理,让图片变成圆形 的基础上继续写的,可以去看看,直接看也没关系,也能看懂 1.首先在res文件夹下创建一个名字为anim的文件夹,名字不要写错  2.在anim里面创建一个xlm文件:img_animation.xml,这个名字随便写都可以,注意不要大写,里面的代码如下: <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http:/

  • Android开发之图片旋转功能实现方法【基于Matrix】

    本文实例讲述了Android开发之图片旋转功能实现方法.分享给大家供大家参考,具体如下: 在Android中进行图像旋转需要使用Matrix,它包含了一个3*3的矩阵,专门用于进行图像变换匹配.Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作.Matrix没有机构体,它必须初始化,然后通过reset方法和set方法来实现. 首先介绍一下矩阵运算.加法和减法就不用说了,太简单了,对应位相加就好.图像处理,主要用到的是乘法 .下面是一个乘法的公式

  • Android中利用matrix 控制图片的旋转、缩放、移动

    本文主要讲解利用android中Matrix控制图形的旋转缩放移动,具体参见一下代码: 复制代码 代码如下: /**  * 使用矩阵控制图片移动.缩放.旋转  */  public class CommonImgEffectView extends View { private Context context ;      private Bitmap mainBmp , controlBmp ;      private int mainBmpWidth , mainBmpHeight , c

  • Android中imageView图片放大缩小及旋转功能示例代码

    一.简介 二.方法 1)设置图片放大缩小效果 第一步:将<ImageView>标签中的android:scaleType设置为"fitCenter" android:scaleType="fitCenter" 第二步:获取屏幕的宽度 DisplayMetrics dm=new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); dm.widthPixels 第三

  • Android实现图片反转、翻转、旋转、放大和缩小

    ********************************************************************** android 实现图片的翻转 ********************************************************************** Resources res = this.getContext().getResources(); img = BitmapFactory.decodeResource(res, R.

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

    主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果:第二类是 Frame 动画,即顺序播放事先做好的图像,跟电影类似.本文分析 Tween动画的rotate实现旋转效果. 在新浪微博客户端中各个操作进行中时activity的右上角都会有个不停旋转的图标,类似刷新的效果,给用户以操作中的提示.这种非模态的提示方式推荐使用,那么下面就分享下如何实现这种效果

随机推荐