Surface和SurfaceView以及SurfaceHolder的认识及使用
2013-06-11 21:56
381 查看
MainActivity如下:
ImageMovingSurfaceView如下:
PhotoMovingSurfaceView如下:
main.xml如下:
package cn.testcleancanvas; import android.os.Bundle; import android.app.Activity; /** * Demo描述: * 0 Surface和SurfaceView以及SurfaceHolder的认识及使用 * 1 Canvas清屏的实现 * 参考资料: * 0 http://blog.csdn.net/pathuang68/article/details/7351317 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457 * Thank you very much */ public class MainActivity extends Activity { private ImageMovingSurfaceView mImageMovingSurfaceView; private PhotoMovingSurfaceView mPhotoMovingSurfaceView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //方式一: mImageMovingSurfaceView= new ImageMovingSurfaceView(MainActivity.this); setContentView(mImageMovingSurfaceView); //方式二: // mPhotoMovingSurfaceView= // new PhotoMovingSurfaceView(MainActivity.this); // setContentView(mPhotoMovingSurfaceView); } }
ImageMovingSurfaceView如下:
package cn.testcleancanvas; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.PorterDuff.Mode; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; /** * 参考资料: * 0 http://blog.csdn.net/pathuang68/article/details/7351317 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457 * * Thank you very much */ public class ImageMovingSurfaceView extends SurfaceView implements Callback { private int lastX=0; private Paint mPaint; private Bitmap mBitmap; private Canvas mCanvas; private boolean isSurfaceRun = true; private SurfaceHolder mSurfaceHolder; private DrawMovingImageThread mDrawMovingImageThread; public ImageMovingSurfaceView(Context context) { super(context); init(); } private void init(){ mPaint=new Paint(); //SurfaceView的方法getHolder() mSurfaceHolder=this.getHolder(); mSurfaceHolder.addCallback(this); mDrawMovingImageThread=new DrawMovingImageThread(); mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } //开启线程不断地绘制Bitmap private class DrawMovingImageThread extends Thread{ @Override public void run() { super.run(); while (isSurfaceRun) { drawMovingImage(); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } } private void drawMovingImage(){ mCanvas=mSurfaceHolder.lockCanvas(); if (mCanvas!=null) { //以下四行为清屏的核心代码: Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); mCanvas.drawPaint(paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); //在每次画之前先进行清屏 mCanvas.drawBitmap(mBitmap, lastX, 40, mPaint); lastX+=20; if (lastX>=370) { lastX=0; } mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } //以下三个方法为android.view.SurfaceHolder.Callback接口的实现 @Override public void surfaceCreated(SurfaceHolder arg0) { mDrawMovingImageThread.start(); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override public void surfaceDestroyed(SurfaceHolder arg0) { isSurfaceRun=false; } }
PhotoMovingSurfaceView如下:
package cn.testcleancanvas; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.PorterDuffXfermode; import android.graphics.PorterDuff.Mode; import android.view.SurfaceHolder; import android.view.SurfaceHolder.Callback; import android.view.SurfaceView; /** * 参考资料: * 0 http://blog.csdn.net/pathuang68/article/details/7351317 * 1 http://blog.csdn.net/yanzi1225627/article/details/8236309 * 2 http://blog.csdn.net/yuanlong_zheng/article/details/7592457 * * Thank you very much */ public class PhotoMovingSurfaceView extends SurfaceView implements Callback { private int lastX=0; private Paint mPaint; private Bitmap mBitmap; private Canvas mCanvas; private boolean isSurfaceRun = true; private SurfaceHolder mSurfaceHolder; private DrawMovingImageThread mDrawMovingImageThread; public PhotoMovingSurfaceView(Context context) { super(context); init(); } private void init(){ mPaint=new Paint(); //SurfaceView的方法getHolder() mSurfaceHolder=this.getHolder(); mSurfaceHolder.addCallback(this); mDrawMovingImageThread=new DrawMovingImageThread(); mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); } //开启线程不断地绘制Bitmap private class DrawMovingImageThread extends Thread{ @Override public void run() { super.run(); while (isSurfaceRun) { drawMovingImage(); try { Thread.sleep(300); } catch (Exception e) { e.printStackTrace(); } } } } private void drawMovingImage(){ mCanvas=mSurfaceHolder.lockCanvas(); if (mCanvas!=null) { //以下四行为清屏的核心代码: Paint paint = new Paint(); paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); mCanvas.drawPaint(paint); paint.setXfermode(new PorterDuffXfermode(Mode.SRC)); //在每次画之前先进行清屏 mCanvas.drawBitmap(mBitmap, lastX, 40, mPaint); lastX+=20; if (lastX>=370) { lastX=0; } mSurfaceHolder.unlockCanvasAndPost(mCanvas); } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); mDrawMovingImageThread.start(); } //以下三个方法为android.view.SurfaceHolder.Callback接口的实现 @Override public void surfaceCreated(SurfaceHolder holder) { //调用SurfaceView的onDraw()方法 onDraw(null); } @Override public void surfaceChanged(SurfaceHolder arg0, int arg1, int arg2, int arg3) { } @Override public void surfaceDestroyed(SurfaceHolder arg0) { isSurfaceRun=false; } }
main.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" > </RelativeLayout>
相关文章推荐
- Surface和SurfaceView以及SurfaceHolder的认识及使用
- Surface和SurfaceView以及SurfaceHolder的认识及使用
- Android学习之旅(第一篇) SurfaceView的原理以及使用场景
- Android SurfaceView、Callback以及SurfaceHolder
- SurfaceView的使用以及缓冲机制
- 【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder
- 【Android游戏开发之三】剖析 SurfaceView ! Callback以及SurfaceHolder
- SurfaceView(包含对消息传递的回顾以及对继承View类使用的回顾)制作指南针
- Android---SurfaceView的使用方法
- 【转】Android Fragment中使用SurfaceView切换时闪一下黑屏的解决办法
- Objective-C ,ios,iphone开发基础:多个视图(view)之间的切换,以及视图之间传值。使用parent <->dismiss
- viewpager和以及在viewpager中使用FragmentPagerAdapter实现分页
- Android开发之ButterKnife,GreenDao简单运用,以及推荐并使用一个好用的开源库BaseRecyclerViewAdapterHelper。
- Android使用Fragment来实现ViewPager的功能(解决切换Fragment状态不保存)以及各个Fragment之间的通信
- android SurfaceView初次使用错误解决办法 (二)
- Android的SurfaceView使用
- ListView之BaseAdapter的基本使用以及ViewHolder模式
- 【Android游戏开发十四】深入Animation,在SurfaceView中照样使用Android—Tween Animation!
- 【Android 基础】RecyclerView 概述以及使用步骤
- View 和 AbsListView中的onSaveInstanceState()方法以及onRestoreInstanceState()方法的使用