Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 371|回复: 0

Android: 利用SurfaceView绘制股票滑动直线解决延迟问题

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-8 12:01:39 | 显示全部楼层 |阅读模式

    1.背景介绍

      最近项目要绘制股票走势图,并绘制能够跟随手指滑动的指示线(Indicator)来精确查看股票价格和日期。如下图所示:

      上图中的那条白色直线就是股票的指示线,用来跟随手指精确确定股票的时间和股票价格。不论是绘制股票图还是绘制指示线,我们首先想到的就是用Android中的自定义View来实现。实践证明,使用View能够很好地实现静态的图片,但是对用动态图像的绘制,往往会出现延迟的现象。就如上图的指示线,实际用View类实现的,跟随手指移动时,指示线就会出现延迟的现象,严重影响了用户体验,这里自然而然的要用到SurfaceView以提高性能,提高滑动的流畅度。

     

    2.Android中View和SurfaceView对比

      下面例举了一下二者的区别:

      View                SurfaceView

      只能在UI主线程中更新画面      UI主线程和新起的独立线程中都可更新画面

      无双缓冲机制            采用双缓冲机制,速度快

      还有其他区别希望大家补充。

     

    3.案例

      下面是该程序实现的主要代码,隐去了数据的填充。

    package com.devin;
    
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.PixelFormat;
    import android.graphics.PorterDuff.Mode;
    import android.view.MotionEvent;
    import android.view.SurfaceHolder;
    import android.view.SurfaceHolder.Callback;
    import android.view.SurfaceView;
    
    public class MyStockIndicatorView extends SurfaceView implements Callback {
    private SurfaceHolder surfaceHolder;
        private Paint paint;
        private float currentX;
    public MyStockIndicatorView(Context context) {
            super(context);
            // 初始化SurfaceHolder
            surfaceHolder = this.getHolder();
            surfaceHolder.addCallback(this);
    
            // 让整个界面透明
            surfaceHolder.setFormat(PixelFormat.TRANSPARENT);
            setZOrderOnTop(true);
    
         //初始化画笔 paint
    = new Paint(); paint.setAntiAlias(true); paint.setColor(Color.WHITE);
        //设置界面可以点击 setFocusable(
    true); }
      //触屏事件,每次响应事件后改变坐标值,然后重新绘制
    public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); int x = (int) event.getX(); switch (eventaction) { case MotionEvent.ACTION_DOWN: currentX = x; paintIndicator(); break; case MotionEvent.ACTION_UP: clearCavas(); break; case MotionEvent.ACTION_MOVE: currentX; paintIndicator(); break; case MotionEvent.ACTION_CANCEL: clearCavas(); break; } return true; }
      //画直线
    private void paintIndicator() { Canvas canvas = surfaceHolder.lockCanvas();     
         //下面两句用来改变原点、同时把默认的坐标系转换成笛卡尔坐标系 //canvas.translate(chartLeft, getHeight()); //canvas.scale(
    1, -1); canvas.drawLine(currentX, 0, currentX, getHeight(), paint); surfaceHolder.unlockCanvasAndPost(canvas); }
      //清屏
    private void clearCavas() {
        //每次绘制前要锁定画布 Canvas canvas
    = surfaceHolder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, Mode.CLEAR);
        //绘制完成后解锁画布 surfaceHolder.unlockCanvasAndPost(canvas); }
    public void surfaceChanged(SurfaceHolder surfaceHolder, int format, int width, int height) { } public void surfaceCreated(SurfaceHolder surfaceHolder) {
         //在此处初始化数据 initData(); }
    public void surfaceDestroyed(SurfaceHolder holder) { } }

       上述代码关键地方都有注释。对于SurfaceView的实现,需要继承SurfaceView和实现Callback接口,同时需要实现三个方法:surfaceCreated、surfaceDestroyed、surfaceChanged方法,分别表示SurfaceView创建、销毁、界面改变时执行的方法。在构造函数中要初始化SurfaceHolder,同时每次绘图前要锁定画布,绘制完成后解锁画布。

     欢迎关注公众号"Devin说",会不定期更新技术知识

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-19 06:30 , Processed in 0.087504 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表