Firemonkey使用MediaPlayer时是没有事件的,需要自己处理,一般在Windows下就算了,大把的播放器可以用,但在Android下比较麻烦,本人尝试用FFMpeg,但编译的so库只支持v7a架构,低级设备支持不好,而且没有编译硬件解码,所以播放时漏帧严重,MediaPlayer也不是个好东西,10.3以下的顶层遮盖问题,10.3以上取不到时间、状态(始终是Stop),所以要解决好几个问题才能满足本人的要求:(本人要求从头播放一个小视频,结束后再播放下一个,右上角可以显示一个图标,下面要显示一个滚动字幕)

研究了一下FMX.Media.Android.pas,决定还是自己封装一个JVideoView

一、播放器事件Listener

网上找了一圈在CSDN上ssxbxk作者倒是写了实现JNI监听器的方法,可惜没写具体使用方法,失败很多次最后才成功。

步骤如下:

1、Delplhi 实现Java Jar包中的Listener,这是ssxbxk作者的原文

2、我要实现的是播放器完成事件,所以使用是JVideoView.setOnCompletionListener

按Ctrl+鼠标左键,找到Androidapi.JNI.Media.pas中的声明,XE10.2.3版本中在2979行位置

  [JavaSignature('android/media/MediaPlayer$OnCompletionListener')]JMediaPlayer_OnCompletionListener = interface(IJavaInstance)['{855040E1-8E41-40EE-B36F-06C212B8AC81}']procedure onCompletion(mp: JMediaPlayer); cdecl;end;

说明只有一个onCompletion方法,下面要实现一个新的类

typeTOnCompletionListener = class(TJavaLocal, JMediaPlayer_OnCompletionListener)private[Weak] FParent: TFrmMain;publicconstructor Create(Parent: TFrmMain);procedure onCompletion(mp: JMediaPlayer); cdecl;end;//--以下是实现部分{ TOnCompletionListener }constructor TOnCompletionListener.Create(Parent: TFrmMain);
begininherited Create;FParent := Parent;
end;procedure TOnCompletionListener.onCompletion(mp: JMediaPlayer);
beginCallInUIThreadAndWaitFinishing(procedurebeginFParent.OnCompleteion(FParent);//调用TFrmMain中的NotifyEvent事件end);
end;

最后使用这个监听器实例,上面那个blog中没有写这部分

varcompletion_event: TOnCompletionListener = nil;//定义成全局的,反正不能定义在栈里(方法的Begin前面)//--创建监听器实例,再设置成JViewView里
completion_event := TOnCompletionListener.Create(Self);
FVideoView.setOnCompletionListener(completion_event);//生成播放完成事件类实例

二、在JViewView上插入原生的JImageView,用来显示图片

说实话,不会点Android,根本没法在FireMonkey下搞原生控件,言归正传,查看FMX.Media.Android.pas发现,JViewView是直接放在JNativeLayout上面的(原生布局控件,Delphi实现的),这个布局控件里只能放一个控件,用SetControl方法(1513行),我要放图片原生控件没法放了,所以要先创建一个其它的布局控件,然后再方向JViewView、JImageView,我这里放的在相对布局JRelativeLayout,具体实现:

  FNativeLayout := TJNativeLayout.JavaClass.init(TAndroidHelper.Activity,MainActivity.getWindow.getDecorView.getWindowToken);//创建原生控件FNativeLayout.setPosition(0, 0);//设置位置
//FNativeLayout.setSize(XXWidth, XXHeight);//在组件大小变化时设置原生控件的Size,参考FMX.Media.Android.pas中的TAndroidVideo.RealignView方法
varparams: JRelativeLayout_LayoutParams;//布局参数
beginFRelativeLayout := TJRelativeLayout.JavaClass.init(TAndroidHelper.Activity);//创建布局控件params := TJRelativeLayout_LayoutParams.JavaClass.init(TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT, TJViewGroup_LayoutParams.JavaClass.MATCH_PARENT);//设置为纵横都拉伸到父控件FRelativeLayout.setLayoutParams(params);
end;

下一步将相对布局放到原生控件里

FNativeLayout.setControl(FRelativeLayout);//添加到原生控件上

再将其它控件放到相对布局里(相对布局里可以放多个控件)

varparams: JRelativeLayout_LayoutParams;
begin//创建JImageView,并设置宽高,设置为右上对齐FImageView := TJImageView.JavaClass.init(TAndroidHelper.Activity);params := TJRelativeLayout_LayoutParams.JavaClass.init(W, H);params.addRule(TJRelativeLayout.JavaClass.ALIGN_PARENT_TOP);params.addRule(TJRelativeLayout.JavaClass.ALIGN_PARENT_RIGHT);params.topMargin := 30;params.rightMargin := 30;FImageView.setLayoutParams(params);
end;
function GetJBitmap(const Bitmap: TBitmap): JBitmap;
varSurface: TBitmapSurface;JavaBitmap: JBitmap;
begin//FireMonkey的Bitmap转成JImageView需要的JBitmapResult := nil;Surface := TBitmapSurface.Create;trySurface.Assign(Bitmap);JavaBitmap := TJBitmap.JavaClass.createBitmap(Surface.Width, Surface.Height, TJBitmap_Config.JavaClass.ARGB_8888);if SurfaceToJBitmap(Surface, JavaBitmap) thenResult := JavaBitmap;finallySurface.DisposeOf;end;
end;//使用方法
procedure ShowImage(Bitmap: TBitmap);
varbmp: JBitmap;
beginbmp := GetJBitmap(Bitmap);CallInUIThread(procedurebeginFImageView.setImageBitmap(bmp);end);
end;

三、滚动字幕

据说使用JTextView可以实现,写法与JImageView差不多,在单行且文字超出时可以自动滚动,关键是要重载isFocused方法,还有一些简单设定

public class AutoMarqueeTextView extends TextView {@Override public boolean isFocused() {//这个方法必须返回true,制造假象,当系统调用该方法的时候,会一直以为TextView已经获取了焦点return true; }
}

好像无法控制滚动速度,最重要的怎么用delphi来实现这个JAVA类的重载,没搞定啊,谁知道记得给我留言啊,多谢。

最终使用ImageView方式实现了滚动字幕,使用原生的JBitmap、JCanvas、JPaint进行自绘,最后将JBitmap设置到ImageView。

需要注意的是屏幕分辨率与字原生控件布局的影响,在FireMonkey中作用Java接口时以PX像素为单位,会导致在分辨率高的屏幕上图像显得小,跟Scale和DPI无关,Scale是屏幕长宽比,DPI是每英寸上像素点个数,这里说的分辨率是屏幕长宽像素个数,所以设置图像布局时的长宽使用屏幕长宽的百分比最合适,可以保证在其它分辨率的屏幕下显示效果一致。

Firemonkey使用Android原生控件一些注意事项相关推荐

  1. Android 原生控件之三 ProgressBar

    Android 原生控件之三 ProgressBar 相关 来源 开始 不确定的进度 确定的进度 XML属性 1.android:animationResolution 2.android:indet ...

  2. Android 原生控件之一 TextView

    Android 原生控件之一 TextView 前言 来源 开始 XML属性 1.android:allowUndo 2.android:autoLink 3.android:autoSizeMaxT ...

  3. Android 原生控件之二 ImageView

    Android 原生控件之二 ImageView 相关 来源 开始 XML属性 1.android:adjustViewBounds 2.android:baseline 3.android:base ...

  4. Delphi XE10 给地图层上面添加Android原生控件

    之前一直在研究如何在Delphi中使用ArcGIS for Android, 其实一直有个让人头痛的问题: 地图可以显示, 但是地图层处于Z轴的最顶层, 因此, 会遮挡掉Delphi界面中的控件... ...

  5. Android原生控件SearchView实现历史搜索记录

    SearchView实现搜索记录看了一些大神写的贴子简单实现, 但我们功能 需要单独删除一条历史搜索记录,好像没在网上找到解决方案,原生方法上也只有suggestions.clearHistory() ...

  6. Qt for Android调用android原生控件安装apk

    Qt开发Android应用,做软件升级的时候,需要调用android借口安装程序, 首先在java文件中用android接口封装一个分享功能的方法,然后在C++中调用 QAndroidJniObjec ...

  7. Android 原生控件ViewFlipper实现淘宝头条垂直滚动广告条

    showPrevious():          显示ViewFlipper里的上一个View 四.ViewFlipper的详细使用设置View 1.首先在xml中声明ViewFlipper < ...

  8. JS与APP原生控件交互

    "热更新"."热部署"相信对于混合式开发的童鞋一定不陌生,那么APP怎么避免每次升级都要在APP应用商店发布呢?这里就用到了混合式开发的概念,对于电商网站尤其显 ...

  9. MAUI中构建跨平台原生控件实现

    简介 MAUI中使用Handler体系来处理不同平台的原生控件实现, 即对应的, 如果我们想要创建控件, 只需要创建基于不同平台的Handler即可. 那么下面主要教大家如何通过创建Handler(事 ...

  10. android自定义组件属性,Android组合控件详解 自定义属性

    组合控件详解 & 自定义属性 组合控件是自定义控件的一种,只不过它是由其他几个原生控件组合而成,故名组合控件. 在实际项目中,GUI 会遇到一些可以提取出来做成自定义控件情况. 一个自定义控件 ...

最新文章

  1. Hi3516ampp编译错误之ls: cannot access '/hiwork/osdrvhi3516a.C02': No such file or directory
  2. 电灯泡内通有交流电,为什么看不到灯泡在闪烁?
  3. C#中的几种加密算法整理
  4. 安全预警:勒索软件正成为制马人的新方向
  5. ostream作为函数返回值_GO语言基础函数
  6. 12. Docker修改默认存储位置
  7. JAVA数组、算法、递归
  8. C++ main函数的几点细节(转载)
  9. xgboost算模型输出的解释
  10. 安装运行okvis odometry
  11. 《毁灭杀手》(kkrieger)
  12. Python实现基于卷积神经网络的LSB算法进行信息隐藏隐写分析
  13. TAM: Temporal Adaptive Module for Video Recognition论文学习
  14. 再见 Excel,你好 Python Spreadsheets! ⛵
  15. JAVA版本号的问题 Java版本号与JDK版本
  16. 蓝本蓝科技:做社群需不需要设置KPI,常见社群KPI指标
  17. 最近做项目所积累的一些小知识(一)
  18. 今天是十月十日卖萌日
  19. elementui 利用周选择器 获取周一到周五的日期 和当前周
  20. 使用spleeter分离音频文件中的伴奏和人声

热门文章

  1. 阿拉伯语排版设计_为阿拉伯用户设计—商业基本阿拉伯用户体验
  2. 发票上的计算机字体,发票代码和发票号码是什么字体
  3. Django下载文件——三种方法和大文件下载
  4. 中国大陆身份证正则表达式(严格验证省份和日期)
  5. 9008刷机模式写入超时刷机帮_刷机帮教你优思高通刷机工具错误处理方法
  6. Roberts算子边缘检测原理及实现
  7. 如何把 Excel 写入数据库
  8. 计算机未来发展展望3000字,关于我的计算机职业生涯规划3000字
  9. Pix4dmapper航测教程——全流程内业处理
  10. matlab生成正弦系数表