zoukankan      html  css  js  c++  java
  • SurfaceView动态背景效果实现

    package com.loaderman.customviewdemo;
    
    import android.content.Context;
    import android.graphics.*;
    import android.util.AttributeSet;
    import android.view.SurfaceHolder;
    import android.view.SurfaceView;
    
    
    public class AnimationSurfaceView extends SurfaceView {
        private SurfaceHolder surfaceHolder;
        private boolean flag = false;// 线程标识
        private Bitmap bitmap_bg;// 背景图
    
        private float mSurfaceWindth, mSurfaceHeight;// 屏幕宽高
        private int mBitposX;//开始绘制的图片的X坐标
        private Canvas mCanvas;
        private Thread thread;
    
        // 背景移动状态
        private enum State {
            LEFT, RINGHT
        }
    
        // 默认为向左
        private State state = State.LEFT;
    
        private final int BITMAP_STEP = 10;// 背景画布移动步伐.
    
        public AnimationSurfaceView(Context context, AttributeSet attrs) {
            super(context, attrs);
            surfaceHolder = getHolder();
            surfaceHolder.addCallback(new SurfaceHolder.Callback() {
                @Override
                public void surfaceCreated(SurfaceHolder holder) {
                    flag = true;
                    startAnimation();
                }
    
                @Override
                public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    
                }
    
                @Override
                public void surfaceDestroyed(SurfaceHolder holder) {
                    flag = false;
                }
            });
        }
    
        private void startAnimation() {
            mSurfaceWindth = getWidth();
            mSurfaceHeight = getHeight();
            int mWindth = (int) (mSurfaceWindth * 3 / 2);
            /***
             * 将图片缩放到屏幕的3/2倍.
             */
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.scenery);
            bitmap_bg = Bitmap.createScaledBitmap(bitmap, mWindth, (int) mSurfaceHeight, true);
    
            //开始绘图
            thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    while (flag) {
                        mCanvas = surfaceHolder.lockCanvas();
                        DrawView();
                        surfaceHolder.unlockCanvasAndPost(mCanvas);
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            });
            thread.start();
        }
    
        /***
         * 进行绘制.
         */
        protected void DrawView() {
            //绘制背景
            mCanvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);// 清屏幕.
            mCanvas.drawBitmap(bitmap_bg, mBitposX, 0, null);// 绘制当前屏幕背景
    
            /** 图片滚动效果 **/
            switch (state) {
                case LEFT:
                    mBitposX -= BITMAP_STEP;// 画布左移
                    break;
                case RINGHT:
                    mBitposX += BITMAP_STEP;// 画布右移
                    break;
    
                default:
                    break;
            }
            if (mBitposX <= -mSurfaceWindth / 2) {
                state = State.RINGHT;
            }
            if (mBitposX >= 0) {
                state = State.LEFT;
            }
        }
    }

    效果:

  • 相关阅读:
    MS CRM 2011 RC中的新特性(4)——活动方面之批量编辑、自定义活动
    最近的一些有关MS CRM 2011的更新
    MS CRM 2011 RC中的新特性(6)——连接
    MS CRM 2011 RC中的新特性(7)—仪表板
    参加MS CRM2011深度培训课程——第一天
    MS CRM 2011插件调试工具
    MS CRM2011实体介绍(四)——目标管理方面的实体
    MS CRM 2011 RC中的新特性(3)——客户服务管理方面
    MS CRM 2011 RC中的新特性(8)—数据管理
    ExtAspNet 登陆
  • 原文地址:https://www.cnblogs.com/loaderman/p/10232129.html
Copyright © 2011-2022 走看看