SurfaceView显示动画效果
来源:互联网 发布:hadoop排序算法解析 编辑:程序博客网 时间:2024/06/05 21:09
SurfaceView显示动画效果
一、基础知识:
SurfaceView继承自View,View负责在主线程中更新动画,而SurfaceView是在一个新线程中更新动画。
SurfaceView类的主要方法:
// 在SurfaceView创建时调用
pubilic abstract void surfaceCreated(SurfaceHolder holder)
// 在SurfaceView改变时调用
pubilic abstract void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
// 在SurfaceView销毁时调用
pubilic abstract void surfaceDestroyed(SurfaceHolder holder)
// 绘制SurfaceView画面
protected void onDraw(Canvas canvas)
(参数canvas是该SurfaceView的画笔,每一次SurfaceView中画面改变都是调用了该方法)
二、实现效果:
首先有一副图片从屏幕的左下角开始向右上方运动,当图片上沿与手机屏幕上沿相撞时,图片的水平速度大小与方向均不变,竖直方向上速度大小不变,
方向相反;当下沿相撞后,同样效果,直到图片飞出屏幕。之后,屏幕渐渐地显示一幅图片。
三、编程实现:
1. 界面编辑(res\layout\main.xml):
[java] view plaincopy
1. <?xml version="1.0" encoding="utf-8"?>
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
3. android:orientation="vertical"
4. android:layout_width="fill_parent"
5. android:layout_height="fill_parent"
6. >
7. <TextView
8. android:layout_width="fill_parent"
9. android:layout_height="wrap_content"
10. android:text="@string/hello"
11. />
12.</LinearLayout>
2. 代码编辑:
(\src\wyf\zcl\MyActivity.java)
[java] view plaincopy
1. package wyf.zcl;
2. /*
3. * 该例子演示surfaceView中简单场景的绘制
4. * MyActivity.java 为程序的主Activity
5. * MySurfaceView.java 为程序的SurfaceView类
6. * Constant.java 常量类,将常量全部写在该类中
7. * OnDrawThread.java 该类的作用是时时刷新onDraw,进行画面的重绘
8. * PicRunThread.java 该类是控制duke图片运动的类
9. * */
10.import android.app.Activity; //引入相关包
11.import android.content.pm.ActivityInfo; //引入相关包
12.import android.os.Bundle; //引入相关包
13.import android.view.Window; //引入相关包
14.import android.view.WindowManager; //引入相关包
15.public class MyActivity extends Activity {
16. /** Called when the activity is first created. */
17. private MySurfaceView msv; //得到surfaceView的引用
18. @Override
19. public void onCreate(Bundle savedInstanceState) { //Activity的生命周期函数,该函数是在程序创建时调用
20. super.onCreate(savedInstanceState);
21. msv=new MySurfaceView(MyActivity.this); //实例化MySurfaceView的对象
22. requestWindowFeature(Window.FEATURE_NO_TITLE); //设置屏幕显示没有title栏
23. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
24. WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置全屏
25. //设置只允许横屏
26. this.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
27. setContentView(msv); //设置Activity显示的内容为msv
28. }
29.}
(\src\wyf\zcl\Constant.java)
[java] view plaincopy
1. package wyf.zcl;
2. import android.view.Display;
3. //Constant.java 常量类,将常量全部写在该类中
4. public class Constant {
5. public static int SCREENWIDTH=480; //屏幕宽(本程序为横屏)
6. public static int SCREENHEIGHT=320; //屏幕高
7. public static int PICWIDTH=64; //图片宽度
8. public static int PICHEIGHT=64; //图片高度
9. public static int ONDRAWSPEED=30; //onDraw线程类的绘制间隔时间
10. public static float PICXSPEED=1.5f; //图片水平移动速度
11. public static float PICYSPEED=2; //图片垂直移动速度
12. public static int PICRUNSPEED=30; //图片的运动线程的刷新速度
13. public static int PICALPHASPEED=20; //图片渐暗效果演示刷新速度
14.}
(\src\wyf\zcl\MySurfaceView.java)
[java] view plaincopy
1. package wyf.zcl;
2. import android.content.Context; //引入相关包
3. import android.graphics.Bitmap; //引入相关包
4. import android.graphics.BitmapFactory; //引入相关包
5. import android.graphics.Canvas; //引入相关包
6. import android.graphics.Color; //引入相关包
7. import android.graphics.Paint; //引入相关包
8. import android.view.Display; //引入相关包
9. import android.view.SurfaceHolder; //引入相关包
10.import android.view.SurfaceView; //引入相关包
11.public class MySurfaceView extends SurfaceView
12.implements SurfaceHolder.Callback{
13. //此处实现SurfaceHolder.Callback接口,为surfaceView添加生命周期回调函数
14. int dy=Display.DEFAULT_DISPLAY;
15. MyActivity ma; //得到MyActivity的引用
16. Paint paint; //画笔的引用
17. OnDrawThread odt; //OnDrawThread类引用
18. PicRunThread prt; //图片运动的Thread类引用
19. private float picX=0; //图片x坐标
20. private float picY=0; //图片y坐标
21. boolean picAlphaFlag=false; //图片变暗效果的标记,false为不显示,true为显示。
22. int picAlphaNum=0; //图片变暗效果中画笔的alpha值
23. public MySurfaceView(Context context) {
24. super(context);
25. this.ma=(MyActivity) context;
26. //将ma的引用指向调用了该Surfaceview类构造器方法的对象,本例为MyActivity
27. this.getHolder().addCallback(this); //注册回调接口
28. paint=new Paint(); //实例化画笔
29. odt=new OnDrawThread(this); //实例化OnDrawThread类
30. prt=new PicRunThread(this); //实例化PicRunThread类
31. prt.start();
32. }
33. public void setPicX(float picX) { //图片x坐标的设置器
34. this.picX = picX;
35. }
36. public void setPicY(float picY) { //图片y坐标的设置器
37. this.picY = picY;
38. }
39. public void setPicAlphaNum(int picAlphaNum) {//图片变暗效果alpha参数设置器
40. this.picAlphaNum = picAlphaNum;
41. }
42. @Override
43. protected void onDraw(Canvas canvas) { //onDraw方法,此方法用于绘制图像,图形等
44. super.onDraw(canvas);
45. paint.setColor(Color.WHITE); //设置画笔为白色
46. canvas.drawRect(0, 0, Constant.SCREENWIDTH, Constant.SCREENHEIGHT, paint);
47. //此处画了一个白色的全屏幕的矩形,目的是设置背景为白色,同时每次重绘时清除背景
48. //进行平面贴图
49. Bitmap bitmapDuke=BitmapFactory.decodeResource(ma.getResources(), R.drawable.duke);
50. canvas.drawBitmap(bitmapDuke, picX, picY, paint);
51. //图片渐暗效果
52. if(picAlphaFlag){
53. Bitmap bitmapBG=BitmapFactory.decodeResource(ma.getResources(), R.drawable.jpg1);
54. paint.setAlpha(picAlphaNum);
55. canvas.drawBitmap(bitmapBG, 0,0, paint);
56. }
57. }
58. @Override
59. public void surfaceChanged(SurfaceHolder holder, int format, int width,
60. int height) { //此方法为当surfaceView改变时调用,如屏幕大小改变。
61. }
62. @Override
63. public void surfaceCreated(SurfaceHolder holder) {//此方法为在surfaceView创建时调用
64. odt.start(); //启动onDraw的绘制线程
65. }
66. @Override
67. public void surfaceDestroyed(SurfaceHolder holder) {//此方法为在surfaceView销毁前调用
68. }
69.}
(\src\wyf\zcl\OnDrawThread.java)
[java] view plaincopy
1. package wyf.zcl;
2. import android.graphics.Canvas; //引入相关包
3. import android.view.SurfaceHolder; //引入相关包
4. //该类的作用是时时刷新onDraw,进行画面的重绘
5. public class OnDrawThread extends Thread{
6. MySurfaceView msv; //得到MySurfaceView的引用
7. SurfaceHolder sh; //SurfaceHolder引用
8. public OnDrawThread(MySurfaceView msv) {
9. super();
10. this.msv = msv; //构造方法中,将msv引用指向调用了该类的MySurfaceView的对象
11. sh=msv.getHolder();
12. }
13. @Override
14. public void run() {
15. super.run();
16. Canvas canvas = null; //Canvas的引用
17. while(true){
18. try{
19. canvas=sh.lockCanvas(null); //将canvas的引用指向surfaceView的canvas的对象
20. synchronized(this.sh){ //绘制过程,可能带来同步方面的问题,加锁
21. if(canvas!=null){
22. msv.onDraw(canvas);
23. }
24. }
25. }finally{
26. try{
27. if(sh!=null){
28. sh.unlockCanvasAndPost(canvas); //绘制完后解锁
29. }
30. }catch(Exception e){e.printStackTrace();}
31. }
32. try{
33. Thread.sleep(Constant.ONDRAWSPEED); //休息1秒钟
34. }catch(Exception e){e.printStackTrace();}
35. }
36. }
37.}
(\src\wyf\zcl\PicRunThread.java)
[java] view plaincopy
1. package wyf.zcl;
2. //该类是控制duke图片运动的类
3. public class PicRunThread extends Thread{
4. MySurfaceView msv; //MySurfaceView的引用
5. private float picX=0; //图片x坐标
6. private float picY=Constant.SCREENHEIGHT-Constant.PICHEIGHT; //图片y坐标
7. boolean yRunFlag=false; //y方向上的运动标记,false时y=y+speed,true时y=y-speed
8. int picAlphaNum=0; //图片变暗效果中画笔的alpha值
9. public PicRunThread(MySurfaceView msv) {
10. super();
11. this.msv = msv; //将该线程类的引用指向调用其的MySurfaceView的对象
12. }
13. @Override
14. public void run() {
15. super.run();
16. while(true){
17. //控制duke图片的运动
18. while(this.picX<Constant.SCREENWIDTH){ //当图片的左边完全超过屏幕的右边时,循环结束
19. msv.setPicX(picX);
20. msv.setPicY(picY);
21. picX=picX+Constant.PICXSPEED;
22. if(yRunFlag){//应该向上运动,自减
23. picY=picY-Constant.PICYSPEED;
24. }else{//应该向下运动,自加
25. picY=picY+Constant.PICYSPEED;
26. }
27. if(picY<=0){ //到达屏幕上沿
28. yRunFlag=false;
29. }else if(picY>Constant.SCREENHEIGHT-Constant.PICHEIGHT){ //到达屏幕下沿
30. yRunFlag=true;
31. }
32. try{
33. Thread.sleep(Constant.PICRUNSPEED);
34. }catch(Exception e){e.printStackTrace();}
35. }
36. //图片变暗效果演示
37. msv.picAlphaFlag=true; //开启图片变暗效果
38. for(picAlphaNum=0;picAlphaNum<=255;picAlphaNum++){
39. if(picAlphaNum==255){
40. msv.picAlphaFlag=false; //当图片变暗效果结束,标记重置
41. picX=0; //图片x坐标
42. picY=Constant.SCREENHEIGHT-Constant.PICHEIGHT; //图片y坐标
43. System.out.println(msv.picAlphaFlag+"picX:"+picX+"picY:"+picY);
44. }
45. msv.setPicAlphaNum(picAlphaNum);
46. try{
47. Thread.sleep(Constant.PICALPHASPEED);
48. }catch(Exception e){e.printStackTrace();}
49. }
50. }
51. }
52.}
- SurfaceView显示动画效果
- Android开发学习SurfaceView显示动画效果
- 【Android开发学习08】SurfaceView显示动画效果
- 实习第八天:SurfaceView显示动画效果(1)
- Android用surfaceView制作动画效果
- SurfaceView 实现水波纹动画效果
- jquery动画显示效果
- 推箱子游戏开发(一) surfaceView 实现动画效果
- 安卓之在SurfaceView中实现动画效果
- 窗口的动画显示效果
- Silverlight 显示隐藏动画效果
- 隐藏/显示界面动画效果
- ListView 一行行显示动画效果
- Android 用surfaceview模拟帧动画的效果,解决帧动画的OOM问题
- Android动画学习(六)之View揭露效果和SurfaceView实现动画
- 优化Java动画编程中的显示效果
- 优化Java动画编程中的显示效果
- 对话框由小到大显示的动画效果
- RMAN备份与恢复(4)恢复无备份的数据文件
- 面向对象的设计原则
- android项目解刨之时间轴
- win8.1如何设置开机密码
- 微博开发2客户端的BaseTask以及BaseTaskPool
- SurfaceView显示动画效果
- 自定义组件研究<三>
- caj文件如何打开
- the setup controller has encountered a problem during install.Please review the log files for furthe
- OC学习之@property与@synthesize理解
- 网球之网球线的学问
- 常用正则表达式
- MFC error可能是堆被损坏,这也说明 XX.exe 中或它所加载的任何 DLL 中有 bug
- Download interrupted: Connection to https://dl-ssl.google.com refused