【达内课程】自定义控件(字幕移动)

2024-05-12 09:32

本文主要是介绍【达内课程】自定义控件(字幕移动),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

创建CustomSurfaceView

public class CustomSurfaceView extends SurfaceView {int viewWidth,viewHeight;//管理surfaceviewSurfaceHolder surfaceHolder;public CustomSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);surfaceHolder = getHolder();MyCallback myCallback = new MyCallback();surfaceHolder.addCallback(myCallback);}class MyCallback implements SurfaceHolder.Callback{//surfaceview创建完成@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {}//surfaceview大小发生变化@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {}//@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {}}
}

activity_main布局中使用控件

    <com.xx.customsurfaceview.CustomSurfaceViewandroid:layout_width="match_parent"android:layout_height="match_parent" />

先了解下执行流程:
surfaceCreated——>surfaceChanged
如果单击返回键执行:
surfaceDestroyed

在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {int viewWidth,viewHeight;//管理surfaceviewSurfaceHolder surfaceHolder;Thread thread;public CustomSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);surfaceHolder = getHolder();MyCallback myCallback = new MyCallback();surfaceHolder.addCallback(myCallback);}class MyRunnable implements Runnable {@Overridepublic void run() {Canvas canvas = null;//view是把内容直接画到屏幕上//surfaceview先把内容画到内存try {canvas = surfaceHolder.lockCanvas();Paint paint = new Paint();paint.setColor(Color.RED);//画背景Rect rect = new Rect(0,0,viewWidth,viewHeight);canvas.drawRect(rect,paint);//画文字paint.setColor(Color.GREEN);paint.setTextSize(48);canvas.drawText("1064",50,200,paint);} catch (Exception e) {e.printStackTrace();} finally {//把内存画好的东西画到屏幕上surfaceHolder.unlockCanvasAndPost(canvas);}}}class MyCallback implements SurfaceHolder.Callback{//surfaceview创建完成@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {thread = new Thread(new MyRunnable());thread.start();}//surfaceview大小发生变化@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {viewWidth = i1;viewHeight = i2;}//@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {}}
}

现在绘制以下效果
在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {......Bitmap heart1,heart2;int imageX;int direction;final static int left = 1;final static int right = 2;boolean isRunning = true;public CustomSurfaceView(Context context, AttributeSet attrs) {super(context, attrs);......heart1 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart1);heart2 = BitmapFactory.decodeResource(getResources(),R.mipmap.heart2);}class MyRunnable implements Runnable {@Overridepublic void run() {while(isRunning){Canvas canvas = null;//view是把内容直接画到屏幕上//surfaceview先把内容画到内存try {......//画图//direction是移动方向if(direction == right){imageX = imageX + 20;canvas.drawBitmap(heart1,imageX,100,paint);}else{imageX = imageX - 20;canvas.drawBitmap(heart2,imageX,100,paint);}//<0说明在最左边if(imageX < 0){direction = right;}//如果大于屏幕宽度,说明移到了最右边if(imageX > viewWidth){direction = left;}Thread.currentThread().sleep(100);} catch (Exception e) {e.printStackTrace();} finally {//把内存画好的东西画到屏幕上surfaceHolder.unlockCanvasAndPost(canvas);}}}}class MyCallback implements SurfaceHolder.Callback{//surfaceview创建完成@Overridepublic void surfaceCreated(SurfaceHolder surfaceHolder) {thread = new Thread(new MyRunnable());thread.start();}//surfaceview大小发生变化@Overridepublic void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i1, int i2) {viewWidth = i1;viewHeight = i2;//开始图片在最右边imageX = i1 ;}//@Overridepublic void surfaceDestroyed(SurfaceHolder surfaceHolder) {isRunning = false;}}
}

其中heart1、heart2是两张png图片

现在实现文字移动效果
在这里插入图片描述

public class CustomSurfaceView extends SurfaceView {......String[] stringArray = {"Errol_King","代码狂欢到深夜"};int stringY;......class MyRunnable implements Runnable {@Overridepublic void run() {while(isRunning){Canvas canvas = null;//view是把内容直接画到屏幕上//surfaceview先把内容画到内存try {canvas = surfaceHolder.lockCanvas();Paint paint = new Paint();paint.setColor(Color.RED);//画背景Rect rect = new Rect(0,0,viewWidth,viewHeight);canvas.drawRect(rect,paint);//画文字......//画图......//画文字paint.setColor(Color.WHITE);paint.setTextSize(70);stringY = stringY - 20;for(int i=0;i<stringArray.length;i++){//假定每行高50int y = stringY + i*70;canvas.drawText(stringArray[i],50,y,paint);}Thread.currentThread().sleep(100);} catch (Exception e) {e.printStackTrace();} finally {//把内存画好的东西画到屏幕上surfaceHolder.unlockCanvasAndPost(canvas);}}}}......
}

Demo下载

这篇关于【达内课程】自定义控件(字幕移动)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/982241

相关文章

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

移动硬盘盒:便携与交互的完美结合 PD 充电IC

在数字化时代的浪潮中,数据已成为我们生活中不可或缺的一部分。随着数据的不断增长,人们对于数据存储的需求也在不断增加。传统的存储设备如U盘、光盘等,虽然具有一定的便携性,但在容量和稳定性方面往往难以满足现代人的需求。而移动硬盘,以其大容量、高稳定性和可移动性,成为了数据存储的优选方案。然而,单纯的移动硬盘在携带和使用上仍存在诸多不便,于是,移动硬盘盒应运而生,以其独特的便携性和交互性,成为了数据存储

VirtualBox中,虚拟系统文件VDI移动或者复制

在安装virtualbox以后有时需要复制,移动虚拟磁盘等操作,这些操作在vmware的虚拟机下面可以直接操作虚拟磁盘即可使用,但是在virtualbox环境 下每个VDI 文件都有一个唯一的uuid,而VirtualBox 不允许注册重复的uuid,所以直接复制的VDI文件是不能拿来使用的,我们就需要使用到virtualbox自带的管理命令来克隆一个VDI,这样通过命令克隆的VDI文件会重

添加自定义的CALayer

iOS开发UI篇—CAlayer(创建图层) 一、添加一个图层 添加图层的步骤: 1.创建layer 2.设置layer的属性(设置了颜色,bounds才能显示出来) 3.将layer添加到界面上(控制器view的layer上)  1 // 2 // YYViewController.m 3 // 01-创建一个简单的图层 4 // 5 //

XMG xib中不属于一个类的控件,拖线到指定的类中

1.比如我现在有一个view绑定为GreenView,我们按住control向类里面拖线的方式想要达到目的,显然拖不进去。例图如下 那么我们此时还想要达到目的,就需要自己去GreenView的类内部去写IBo 然后这面连接起来 2.第二,大哥郝良建给做的扩展 可以在.h或者.m中写一个NSObject的属性 然后在xib中对应的位置创建一个NSObject的属性

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment="Center" Content="Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header="打开"/><MenuItem Header="-"/><MenuItem Header="关闭"/></MenuFlyout></Button.Flyout></B

android自定义View的和FramgentActivity的一个小坑

对于自定义View //加载样式TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TitleBarView, defStyleAttr, 0);setTitle(typedArray.getString(R.styleable.TitleBarView_main_title));//不能写成

第三十七章 添加和使用自定义标题元素 - 自定义标头的继承

文章目录 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承自定义标头的继承示例 在 `SOAPHEADERS` 参数中指定支持的标头元素自定义标头的继承 第三十七章 添加和使用自定义标题元素 - 自定义标头的继承 自定义标头的继承 如果创建此Web 服务的子类,该子类将继承不特定于方法的标头信息 — 包含在 <request> 或 <response> 元素中的标头信

3_创建Tab控件

1,新建MFC 对话框项目,为对话框添加Tab控件,选中Tab控件,新建控件变量m_tab_ctrl 2,为Tab控件添加tab项 m_tab_ctrl.InsertItem(0, L”000”),参数1,哪个位置;参数2,item的名称 3,为Tab控件添加监听事件, void C测试Dlg::OnTcnSelchangeTab1(NMHDR *pNMHDR, LRESUL

物联网系统运维——移动电商应用发布,Tomcat应用服务器,实验CentOS 7安装JDK与Tomcat,配置Tomcat Web管理界面

一.Tomcat应用服务器 1.Tomcat介绍 Tomcat是- -个免费的开源的Ser Ivet容器,它是Apache基金会的Jakarta 项目中的一个核心项目,由Apache, Sun和其他一 些公司及个人共同开发而成。Tomcat是一一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP程序的首选。 在Tomcat中,应用程序的成部署很简