Android中一种常见的自定义画UI接口类:SurfaceView.可以在异步线程中,完成相关数据更新。

首先介绍几个基本的定义,在其他知识中也会设计如下名词:

1.Paint

  画笔,所有的图像、图形都是由画笔完成的。

  定义非常简单:

  Paint paint = new Paint();

  paint.setColor(Color.Black);//设置画笔的颜色

2.Canvas

  画布,图像和图形都是通过Paint画在画布上面。画布对象通常是通过SurfaceHolder.lockCanvax()获得。

  Canvas canvas = holder.lockCanvas();

  canvas.drawRect(0,0,widht,height,paint);//画矩形

3.Surface

  在应用的时候,没有使用到具体的实现类和抽象类。

  API里面的描述是:Surface是原始图像缓存区的一个句柄(原始图像缓存区是有屏幕图像合成器管理的)。因此,可以知道Canvas所需要展示的数据,会被加载到Surface中,然后显示在屏幕上的。  

4.SurfaceView

  一个屏幕显示的View,控制Surface的显示大小,位置等。说白了就类似TextView一样。

  需要子类实现具体的制订化功能,继承SurfaceView的同时,还需要实现SurfaceHolder.Callback接口(后面有讲解)。

5.SurfaceHolder

  怎么能说清楚呢,SurfaceHolder是Surface的控制器,提供几个方法:

  addCallback(SurfaceHolder.Callback callback); //添加SurfaceHolder.Callback的监听实现

  lockCanvas();

  lockCanvas(Rect dirty);

  unlockCanvas(Canvas canvas);

6.SurfaceHolder.Callback

  是一个接口,实现类可以监听SurfaceView的状态变化。接口方法如下:

  surfaceCreated();

  surfaceChanged();

  surfaceDestory();

  

具体使用Demo,完成的功能就是将一张图片,上下不停的滑动:

1、RBSurfaceView 是Surface的实现类。

public class RBSurfaceView extends SurfaceView implements SurfaceHolder.Callback{
    private Paint paint;
    private WindowManager windowManager;
    private Context context;
    private float screenWidth,screenHeight;
    private float bitmapX,bitmapY;
    private int alphaNum;
    private boolean alphaFlag ;
    
    private OnRunThread onRunThread;
    private OnDrawThread onDrawThread;
    
    @SuppressWarnings("deprecation")
    public RBSurfaceView(Context context) {
        super(context);
        // TODO Auto-generated constructor stub
        this.context = context;
        getHolder().addCallback(this);
        windowManager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
        screenWidth = (float) windowManager.getDefaultDisplay().getWidth();
        screenHeight =(float)  windowManager.getDefaultDisplay().getHeight();
        paint = new Paint();
        onRunThread = new OnRunThread(this);
        onDrawThread = new OnDrawThread(this);
        onRunThread.start();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        super.onDraw(canvas);
        paint.setColor(Color.WHITE);
        canvas.drawRect(0, 0, screenWidth, screenHeight, paint);
        Bitmap bitmapA = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
        canvas.drawBitmap(bitmapA, bitmapX, bitmapY, paint);
        if (alphaFlag) {
            Bitmap bitmapB = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon_gcoding);
            paint.setAlpha(alphaNum);
            canvas.drawBitmap(bitmapB, 0, 0, paint);
        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        onDrawThread.start();
    }

@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub
        
    }

@Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub
        
    }
    public float getBitmapX() {
        return bitmapX;
    }
    public void setBitmapX(float bitmapX) {
        this.bitmapX = bitmapX;
    }
    public float getBitmapY() {
        return bitmapY;
    }
    public void setBitmapY(float bitmapY) {
        this.bitmapY = bitmapY;
    }
    public int getAlphaNum() {
        return alphaNum;
    }
    public void setAlphaNum(int alphaNum) {
        this.alphaNum = alphaNum;
    }
    public float getScreenWidth() {
        return screenWidth;
    }
    public void setScreenWidth(float screenWidth) {
        this.screenWidth = screenWidth;
    }
    public float getScreenHeight() {
        return screenHeight;
    }
    public void setScreenHeight(float screenHeight) {
        this.screenHeight = screenHeight;
    }
    public boolean isAlphaFlag() {
        return alphaFlag;
    }
    public void setAlphaFlag(boolean alphaFlag) {
        this.alphaFlag = alphaFlag;
    }
}
  

2、OnDrawThread 是不停的让RBSurfaceView的onDraw方法画图片

public class OnDrawThread extends Thread{
    private RBSurfaceView surfaceView;
    private SurfaceHolder holder;
    public OnDrawThread(RBSurfaceView surfaceView){
        super();
        this.surfaceView = surfaceView;
        holder = surfaceView.getHolder();
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        Canvas canvas = null;
        while (true) {
            canvas = holder.lockCanvas(null);
            synchronized (surfaceView) {
                if (canvas != null) {
                    surfaceView.onDraw(canvas);
                }    
            }
            holder.unlockCanvasAndPost(canvas);
            try {
                Thread.sleep(30);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
        }
    }
}

3、OnRunThread 主要负责不停的变化图片的坐标,然后设置给RBSurfaceView。

public class OnRunThread extends Thread{
    private RBSurfaceView surfaceView;
    private SurfaceHolder holder;
    public OnRunThread(RBSurfaceView surfaceView){
        super();
        this.surfaceView = surfaceView;
        holder = surfaceView.getHolder();
        bitmapX = 0;
        bitmapY = 0;
    }
    boolean runFlag;
    int alphaNum;
    float bitmapX;
    float bitmapY;
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        while (true) {
            while (bitmapX < surfaceView.getScreenWidth()) {
                surfaceView.setBitmapX(bitmapX);
                surfaceView.setBitmapY(bitmapY);
                if (runFlag) {
                    bitmapY = bitmapY - 20;
                }else {
                    bitmapY = bitmapY + 20;
                }
                if (bitmapY <=0) {
                    runFlag = false;
                }else if (bitmapY >= surfaceView.getScreenHeight()+60) {
                    runFlag = true;
                }
                try {
                    Thread.sleep(30);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            surfaceView.setAlphaFlag(true);
            for (alphaNum = 0; alphaNum <= 255; alphaNum++) {
                if (alphaNum == 255) {
                    surfaceView.setAlphaFlag(false);
                    bitmapX = 0;
                    bitmapY = surfaceView.getScreenHeight() +60;
                }
                surfaceView.setAlphaNum(alphaNum);
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }                
            }
        }
    }
}

  

  

    

Android 开发 SurfaceView 总结的更多相关文章

  1. Android开发学习清单

    目录: 第1章 Android应用与开发环境1.1 Android的发展和历史1.1.1 Android的发展和简介1.1.2 Android平台架构及特性1.2 搭建Android开发环境1.2.1 ...

  2. Android使用SurfaceView实现墨迹天气的风车效果

    SurfaceView也是继承自View,它和我们以前接触到的View(Button.TextView等)最大的不同是,SurfaceView可以有一个单独的线程进行绘制,这个线程区别于UI线程(主线 ...

  3. Android开发中的问题及相应解决(持续更新)

    最近博客写的少了,以后还得经常更新才行. ------------------------------------------------------------ 1.特定业务需求下try cath ...

  4. Android之SurfaceView学习(一)

    对应的中文翻译SurfaceView是视图(View)的继承类,这个视图里内嵌了一个专门用于绘制的Surface.你可以控制这个Surface的格式和尺寸.Surfaceview控制这个Surface ...

  5. 【随笔】android开发的学习路线

    第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...

  6. Android开发中,那些让您觉得相见恨晚的方法、类或接口

    Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...

  7. Android开发面试经——4.常见Android进阶笔试题(更新中...)

      Android开发(29)  版权声明:本文为寻梦-finddreams原创文章,请关注:http://blog.csdn.net/finddreams 关注finddreams博客:http:/ ...

  8. [转]【eoeAndroid索引】史上最牛最全android开发知识汇总

    一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...

  9. android开发的学习路线(转)

    第一阶段:Java面向对象编程 1.Java基本数据类型与表达式,分支循环. 2.String和StringBuffer的使用.正则表达式. 3.面向对象的抽象,封装,继承,多态,类与对象,对象初始化 ...

随机推荐

  1. 基于Docker的Consul集群实现服务发现

    服务发现 其实简单说,服务发现就是解耦服务与IP地址之间的硬绑定关系,以典型的集群为例,对于集群来说,是有多个节点的,这些节点对应多个IP(或者同一个IP的不同端口号),集群中不同节点责任是不一样的. ...

  2. CSRF 攻击的应对之道 转载

    CSRF 背景与介绍 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一.其他安全隐患,比如 ...

  3. 在IE8的基础上安装IE11

    安装包下载 链接:https://pan.baidu.com/s/1WAuyMg_SrfVa0wLjoop5Jw   提取码:nh1r 安装方式 先运行 - EIE11_ZH-CN_WOL_WIN76 ...

  4. C#设计模式学习笔记:简单工厂模式(工厂方法模式前奏篇)

    本笔记摘抄自:https://www.cnblogs.com/PatrickLiu/p/7551373.html,记录一下学习过程以备后续查用. 一.引言 简单工厂模式并不属于GoF23里面的设计模式 ...

  5. 【jQuery实例】Ajax登录页面

    登录界面是信息系统提供的必备的功能,是提供给用户提供维护信息的接口.接下来,我来带领大家打造一个漂亮.安全的登录界面,使用的技术是ASP.NET+jQuery 先来看看预览效果   Ajax登录重点在 ...

  6. Python标准库之subprocess模块

    运行python的时候,我们都是在创建并运行一个进程.像Linux进程那样,一个进程可以fork一个子进程,并让这个子进程exec另外一个程序.在Python中,我们通过标准库中的subprocess ...

  7. python3练习100题——051

    题目:学习使用按位与 & . 不会的知识点,查了一下按位运算. 按位运算符是把数字看作二进制来进行计算的. 运算符 描述 实例 & 按位与运算符:参与运算的两个值,如果两个相应位都为1 ...

  8. AC自动机(模板+例题)

    首先要明白AC自动机是干什么的: AC自动机其实就是一种多模匹配算法,那么你可能会问什么叫做多模匹配算法.下面是我对多模匹配的理解,与多模与之对于的是单模,单模就是给你一个单词,然后给你一个字符串,问 ...

  9. js动画函数

    var tween = { linear: function (t, b, c, d) { return c * t / d + b; }, easeIn: function (t, b, c, d) ...

  10. 【巨杉数据库SequoiaDB】巨杉再获企业级认可,分布式数据库领跑“一亿中流”

    据全球最具权威的IT研究与顾问咨询公司 Gartner 预测,DBMS(数据库管理系统)市场从2017年到2018年增长了18.4%,达到461亿美元,这是有史以来最大幅的增长,并有望在2019年超过 ...