SurfaceView实现canvas中的图形上下滚动

Android SurfaceView实战 打造抽奖转盘 【Android开发核心知识点笔记】【Android思维脑图(技能树)】【Android核心高级技术PDF文档,BAT大厂面试真题解析】【Android高级架构视频学习资源】《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!大厂,18年进入阿里一直到现在。**深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。 阅读详情

由于移动设备屏幕通常比较小,可能不能满足工程中整个图形的显示,我找了很久就是没找到在surfaceView中实现canvas上下滚动。解决此问题我认为有两种思路,一种思路根据手的滑动,动态的绘制图形,即不断的重复清屏和绘制;另一种思路是借助ScrollView,设置surfaceView的高宽(注意:默认情况下surfaceView的高和宽即是canvas的高和宽,也可以自己修改)。第二种思路实现起来比较简单,本文实现了第二种思路如下:

1、图形

      
2、源代码

 

xml文件


<?xml version="1.0" encoding="utf-8"?>
<ScrollView 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"
    tools:context=".SurfaceViewSlideActivity"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <SurfaceView
            android:id="@+id/surface_view"
            android:background="#FFFFFF"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</ScrollView>

SurfaceViewSlideActivity文件

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.SurfaceView;
import android.view.ViewGroup;

public class SurfaceViewSlideActivity extends AppCompatActivity {

    private SurfaceView surfaceView = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_surface_view_slide);

        // 获得surfaceView
        this.surfaceView = findViewById(R.id.surface_view);

        // 获得屏幕的高度
        DisplayMetrics metric = new DisplayMetrics();
        this.getWindowManager().getDefaultDisplay().getMetrics(metric);
        int height = metric.heightPixels;

        // 重置SurfaceView的高度
        ViewGroup.LayoutParams params = this.surfaceView.getLayoutParams();
        params.height = 2*height;

        SurfaceViewSlide surfaceView = new SurfaceViewSlide(this, this.surfaceView);

    }
}

SurfaceViewSlide文件

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

/**
 * Create by RuiAiXinAn 2019/5/22
 * Class description:
 */
public class SurfaceViewSlide extends SurfaceView implements SurfaceHolder.Callback{

    private SurfaceHolder surfaceHolder = null;
    private Paint paint = null;

    public SurfaceViewSlide(Context context, SurfaceView surfaceView) {
        super(context);

        this.surfaceHolder = surfaceView.getHolder();

        // 设置为透明,如果不设置为透明,则绘制的直线不显示
        surfaceView.setZOrderOnTop(true);
        this.surfaceHolder.setFormat(PixelFormat.TRANSLUCENT);

        // 设置画笔
        this.paint = new Paint();
        this.paint.setColor(Color.BLACK);
        this.paint.setStrokeWidth(2.0f);
        this.paint.setStyle(Paint.Style.STROKE);
        this.paint.setAntiAlias(true);

        // 添加回调
        this.surfaceHolder.addCallback(this);
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {

        // 绘制直线
        Canvas canvas = this.surfaceHolder.lockCanvas();
        // 清除canvas上的图
        // this.canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
        canvas.drawLine(1,1,2000,2000, this.paint);
        this.surfaceHolder.unlockCanvasAndPost(canvas);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }
}

Android自定义控件开发入门与实战(15)SurfaceView 很多人在刚接触这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从哪里入手去学习,对此我整理了一些资料如果你熟练掌握以下列出的知识点,相信将会大大增加你通过前两轮技术面试的几率!这些内容都供大家参考,互相学习。①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取! 阅读详情

相关推荐

Android水滴下拉刷新控件CircleRefreshLayout实现与优化

下拉刷新是移动应用开发中的基础交互模式,其核心原理是通过手势识别触发数据更新。传统实现多采用进度条形式,而现代物理动画引擎(如贝塞尔曲线)能创造更生动的视觉效果。CircleRefreshLayout作为开源控件,通过水滴形变动画提升用户体验,同时采用性能优化策略如合理使用invalidate()和Canvas.clipPath。这类技术在电商、社交等高频刷新场景尤为重要,开发者可通过接口解耦设计快速集成到ListView/RecyclerView,其手势冲突解决方案和内存管理机制对Android性能优化具

weixin_30550081的博客 341

surfaceview如何实现可以滚动的画板

surfaceview滚动如何做啊,画板的时候,surfaceview大小大于屏幕,在上面画一条线,可以滚上去,然后又画一条线,滚下来,原来画的线还在。

houcuo2113的博客 777

Android基础回顾】六:安卓显示机制Surface 、 SurfaceFlinger、Choreographer

在 Android 系统中,Surface 和 SurfaceFlinger 是图形渲染系统的核心组件,负责屏幕显示内容的合成与管理。它们协同工作,使各种 App 和系统界面能够高效地显示在屏幕上。

Shujie 1536

canvas实现圆轨滑动

canvas实现圆轨滑动

qq_45939676的博客 889

Unity内嵌网页动态适配:UniWebView与UGUI深度集成实战指南

在Unity应用开发中,内嵌网页是连接原生应用与Web内容的常见技术方案,其核心在于实现跨平台渲染与交互的无缝融合。从技术原理上看,这涉及Unity的UGUI布局系统与原生WebView组件之间的坐标系转换、事件传递与渲染层级管理。其技术价值在于能够复用成熟的Web生态内容,同时保持原生应用的性能与体验。典型的应用场景包括游戏内的活动页面、客服系统、数据仪表盘或第三方服务集成。本文聚焦于使用UniWebView插件时,如何通过锚点协同、动态内容高度适配及输入事件处理等进阶技巧,解决网页视图在复杂UGUI界面

优快云头条 695

Unity引擎打造Android动态壁纸:原理、实现与性能优化全解析

动态壁纸作为Android系统的特色功能,通过WallpaperService在系统层级提供动态视觉体验。其核心原理是利用Surface进行帧绘制,传统方案受限于Canvas或OpenGL ES的图形处理能力。Unity引擎凭借其强大的实时渲染与跨平台特性,为动态壁纸开发带来了突破。通过JNI与AndroidJavaObject实现的双向通信机制,Unity运行时得以嵌入WallpaperService,将游戏级的粒子效果与物理模拟应用于系统组件。这种技术方案尤其适用于需要复杂视觉效果与交互逻辑的场景,例如

weixin_33946605的博客 380

解决 canvas隐藏后出现滚动条的问题

现在的 canvas 不能像 h5的 canvas 一样把 画布大小 和 显示大小分别设置,且 canvas 不能 `display:none`。 分享下我的处理方法: 把 canvas 包裹在一个 view 中, 然后把这个 view 高度变成 0,`overflow: hidden` 掉, 也可以把它定位出去。总之就是利用类似的方法把 canvas 隐藏。然后在绘制 canvas 结束后把 canvas 导出到 tempfile,用 img src 去加载。这样可以设置一个较大的画布,但展示成想要的

hbqjzx的专栏 1421

从Wi-Fi到蓝牙:手把手教你用Cadence Virtuoso搭建一个2.4GHz锁相环频率综合器(含PFD/CP/VCO模块设计)

本文详细介绍了如何在Cadence Virtuoso中设计一个2.4GHz锁相环频率综合器(PLL),涵盖从系统架构到模块级设计的全流程。重点解析了PFD、CP和VCO等核心模块的设计技巧与仿真验证方法,帮助模拟集成电路设计师掌握高频PLL的实现要点,满足Wi-Fi和蓝牙等无线通信标准的要求。

weixin_30315723的博客 418

canvas画一个图片,并实现点击按钮上移下移左移右移放大缩小

左移 右移 上移 下移 放大 缩小 // canvas元素, 图片元素 var x = document.querySelector("#canvas"); var image = new Image(); var ctx = x.getContext("2d"); var drawcircle = fun

肖肖肖丽珠的博客 4239

2026深度破解:OpenClaw开源AI框架架构与实战全景解析

2026年初,一款名为OpenClaw的开源AI Agent框架以惊人的速度席卷全球开发者社区,短短数周GitHub星标突破20万,成为史上增长最快的开源项目。本文从架构设计、核心原理、代码实现和工程实战四个维度,深度剖析OpenClaw的技术内核,帮助开发者从理解到实践,快速掌握这一革命性的AI开发框架。

fox0329的博客 2373

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 441

canvas图形操作(缩放、旋转、位移)

手把手编写canvas缩放、旋转、位移操作

一起coding,一起嗨。 5660

避开这5个坑!Tushare金融数据获取与分析的常见错误排查指南

本文详细解析了使用Tushare进行金融数据获取与分析时常见的5个问题,包括Token失效、数据缺失、频率限制、数据一致性和性能瓶颈,并提供了实用的解决方案和优化策略。通过Python代码示例和最佳实践,帮助金融数据分析师和量化开发者高效避开这些陷阱,提升工作效率。

x2y3z4a5b的博客 1036

Android SurfaceView 绘图覆盖刷新及脏矩形刷新方法

SurfaceView在Android中用作游戏开发是最适宜的,本文就将演示游戏开发中常用的两种绘图刷新策略在SurfaceView中的实现方法。   首先我们来看一下本例需要用到的两个素材图片:   bj.jpg就是一个渐变图,用作背景。   question.png是一个半透明的图像,我们希望将它放在上面,围绕其圆心不断旋转。   实现代码如下:   package SkyD.Su

自由空间 1368

ABAP Development Tool for Visual Studio Code 里使用 MCP server

本文讨论了SAP ABAP开发环境中,除GitHub Copilot外,其他可作为MCP客户端接入ABAP开发工具(MCP server)的编码代理(coding agent)。GitHub Copilot是官方确认可用的工具,而其他代理如Claude Code、Cursor、Windsurf Cascade、Cline和Continue虽然理论上支持MCP协议,但要实际用于ABAP开发还需满足两个关键条件:兼容MCP协议,并能处理VS Code虚拟工作区文件系统。这些工具需要单独验证是否支持ABAP开发工

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 258

C 语言多文件编程 : 大型程序的组织与管理

本文介绍了C语言多文件编程的核心概念与实践方法。主要内容包括:1. 多文件编程的必要性:解决单文件编程在大型项目中的维护和协作问题;2. 文件组织方式:头文件(.h)负责声明接口,源文件(.c)实现具体功能;3. 编译链接过程:分阶段编译和链接多个源文件;4. 头文件设计原则:包含接口声明、使用保护机制、保持自包含性;5. 模块化实践:通过示例展示学生信息管理系统的模块划分;6. 构建工具:介绍Makefile的编写和使用方法。文章还提供了创建静态库和动态库的指导,并强调了模块化设计、信息隐藏等软件工程原则

2503_91057718的博客 1947

Android实现弹幕功能效果(附带源码)

Android实现弹幕功能效果(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 1978

小孙学变频学习笔记(二)变频器的逆变电路

本文主要介绍了变频器中逆变电路的核心器件IGBT及其应用。IGBT是一种电压控制型三端半导体开关器件,具有开关频率高、功耗低的优点,在变频器中仅使用截止和饱和导通状态。文章详细分析了IGBT的结构特性、与晶闸管的区别,以及由四个IGBT组成的直流转交流逆变电路原理。重点阐述了IGBT并联反向二极管的作用:提供电流反向通路、避免反向电压损坏器件、提高开关效率等。最后提供了相关学习参考网址供读者进一步研究。

qq_43091070的博客 1196

安卓Canvas绘图教程:自定义View与性能优化

安卓Canvas是Android平台上进行2D图形绘制的核心类,它为你提供了一块“画布”,允许你直接控制像素来绘制形状、文本、位图以及实现各种自定义视觉效果。

2509_93883384的博客 115

Ubuntu零基础入门到精通【1.2讲】:Ubuntu 与 Linux 的关系 —— 你用的到底是什么?

🏆 本文收录于 《滚雪球学 Ubuntu》 专栏。 本专栏面向有一定计算机基础,但尚未系统学习 Linux / Ubuntu 的读者,采用“滚雪球式学习法”:先装好、再会用、再理解、再优化、再实战,带你从第一次进入 Ubuntu 桌面 / 终端开始,逐步掌握 Ubuntu 的日常使用、命令操作、软件安装、系统配置、开发环境搭建与服务器部署能力。

**My Coding Family** 3227

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

自定义View实现抽奖转盘

public class LuckCircle extends SurfaceView implements SurfaceHolder.Callback,Runnable { private SurfaceHolder mHolder; private Canvas mCanvas; /* * 用于绘制的线程 * */ private Thre

flying_fish_wj的博客 945

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Android硬件加速源码解析:从Canvas到GPU的渲染全链路

在Android应用开发中,UI渲染性能是衡量用户体验的关键指标。传统软件渲染完全依赖CPU进行像素计算,在复杂动画或频繁更新时容易成为性能瓶颈。硬件加速通过重构渲染流水线,引入GPU并行计算能力,将绘制命令转化为GPU可执行的指令序列,实现了渲染效率的质的飞跃。其核心原理在于将绘制操作序列化为DisplayList,由独立的RenderThread驱动GPU执行,从而大幅降低主线程负载。这项技术为流畅滚动、复杂动画和实时交互提供了基础支撑,广泛应用于对性能要求严苛的移动应用场景。本文以Android硬件加

weixin_34405354的博客 339

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Android 渲染流水线全解析:从 Choreographer 到 SurfaceFlinger

核心记忆点VSync 是节拍器:Choreographer 靠它对齐绘制节奏Surface 是画布:应用画完提交给系统SurfaceFlinger 是合成器:把多个应用的 Layer 拼成一张图HWC 是加速器:能用硬件就不用 GPU,省电省资源卡顿在应用层:系统层通常不是瓶颈,主线程耗时才是。

天行健,君子以自强不息。 417

android中图像绘制

Canvas决定绘制什么, 而paint决定如何绘制              Canvas类封装了用作绘图表面的位图;它还提供了draw*方法来实现设计。        下面的列表提供了对可用的基本图形的简要说明,但并没有深入地探讨每一个draw方法的详细内容:        drawARGB / drawRGB / drawColor  使用单一的颜色填充画布。    

lcmssd 943

Unity全平台PDF渲染插件集成指南:从UI到3D物体的完整解决方案

在跨平台应用开发中,文档渲染与交互是常见的核心技术需求。其原理涉及文件解析、图形光栅化、内存管理与平台原生接口适配等多个底层技术环节。这项技术的核心价值在于,它能够将复杂的文档格式(如PDF)高效、准确地转换为可视化的图形界面元素,同时保持文本可搜索、可复制等原生特性,极大地提升了应用的功能完整性与用户体验。在游戏开发、教育软件、企业工具及AR/VR等应用场景中,实现稳定、高性能的文档展示功能至关重要。本文聚焦于Unity引擎环境,深入探讨如何利用成熟的第三方插件,一站式解决PDF文档的**全平台支持**与

weixin_30512043的博客 359

Android游戏开发---2D游戏中背景的绘制

游戏制作初始,绘制背景是其中很靠前的步骤。 类似于雷电的游戏,手机游戏屏幕大小固定,不可能采取移动飞机本身来得到移动的效果。一般都采用移动背景的办法来产生飞机动的效果。 关于移动背景,有两种做法: 1. 一副大长图慢慢移动(一整个关卡就一张图)。 2. 一张上下部分能衔接着的图循环移动。 注意:后绘制的图片会覆盖先绘制的图片。    第一种移动背景的方法简单,没有太多可讨论的。下

taki_dsm的专栏 916
上一篇: Java中同时读写字符和字节
下一篇: Android监听蓝牙与设备连接状态、关闭和打开状态
MasonYyp
博客等级 码龄9年 301粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值