精华内容
下载资源
问答
  • Android 图片文字识别DEMO(基于百度OCR) 前言   OCR 是 Optical Character Recognition 的缩写,翻译为光学字符识别,指的是针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,...

    Android 图片文字识别DEMO(基于百度OCR)

     

    前言

      OCR 是 Optical Character Recognition 的缩写,翻译为光学字符识别,指的是针对印刷体字符,采用光学的方式将纸质文档中的文字转换成为黑白点阵的图像文件,通过识别软件将图像中的文字转换成文本格式,供文字处理软件进一步编辑加工的技术(好吧,这是我查来的)。简单的来说,OCR技术就是可以把图片上的文字识别出来,并以文本格式的形式提取出来。

      这个技术的应用方面很广泛,比如说把纸质书籍的内容转化为电子书,之前都需要人手打,但是现在只要扫描一下,将扫描出来的图片通过OCR技术转化成文本格式,效率和成本不知提升了多少倍。

      有人可能会想,这个技术听起来好高端,不懂计算机图形学,模式识别,机器学习巴拉巴拉东西的人,是不是无法接触到这样的技术,实现这样的功能,(好像是的,emmm...),不过,虽然咱们自己实现不了,但是有人把轮子造好了呀,我们只要使用人家造好的轮子,就能实现图片文字识别的功能。

      先来看一下我实现的效果吧,随手拿了办公桌上有字的东西(拿了枸杞茶和菊花茶的包装...),用自己写的demo拍了照识别了一下

     

    图片文字识别1

     

    图片文字识别2

     

      界面下方显示的图片是手机拍的照片,界面上方显示的是从照片中识别出来的文字信息。可以看出识别的正确率还是挺高的。

      我这边用的轮子是 百度文字识别 。下面我将介绍一下我是如何实现上述的文字识别功能。

    请求模块定义

      百度其实有提供图片识别Android的SDK,就像其他的SDK一样,只要导入一系列包之后就可以调用识别。寻求快速开发的小伙伴可以了解一下,我看了一下文档,实现还是十分容易的。

    OCR Android SDK


      但是,我在demo中使用的并非是SDK,而是使用另外一种方法——以网络api的方式来进行识别。涉及到的技术有 retrofit+rxjava 进行网络请求(在之前的一篇博客中有介绍如何使用 retrofit+rxjava ,贴一下链接),Android应用动态权限的申请,FileProvider,图片的base64转码,以及热门的MVP框架

     

     

     

      先看一下项目结构

    项目结构.png

     

      module目录下存放的是MVP架构的三个模块,bean目录下存放的是网络请求返回的数据类型,apiservice中存放的是retrofit有关网络请求的接口。

      根据百度OCR官方给出的接口

    api请求说明.png


      我们定义出如下的接口方法。

     /**
         * 通过图片URL的形式,获取图片内的文字信息
         * @param accessToken 通过API Key和Secret Key获取的access_token
         * @param url 图片的url
         * @return observable对象用于rxjava,从RecognitionResultBean中可以获得图片文字识别的信息
         */
        @POST("rest/2.0/ocr/v1/general_basic")
        @FormUrlEncoded
        Observable<RecognitionResultBean> getRecognitionResultByUrl(@Field("access_token") String accessToken, @Field("url") String url);
    
        /**
         * 通过图片,获取图片内的文字信息
         * @param accessToken 通过API Key和Secret Key获取的access_token
         * @param image 图像数据base64编码后进行urlencode后的String
         * @return  observable对象用于rxjava,从RecognitionResultBean中可以获得图片文字识别的信息
         */
        @POST("rest/2.0/ocr/v1/general_basic")
        @FormUrlEncoded
        Observable<RecognitionResultBean> getRecognitionResultByImage(@Field("access_token") String accessToken, @Field("image") String image);
    

      在第一个方法中,我们需要传入两个参数,一个是access_token,需申请百度文字识别的开发者资格,得到API key和Secret Key后获取,还有一个参数是图片的网络地址url,可以直接通过这个url直接访问到图片。

      第二个方法中,第一个参数也是同上的access_token,第二个参数则是String类型,这个参数是在本地将图片base64转码之后生成。

      因为我们要实现的功能是用手机拍照,然后将照片信息传递给服务器,因此我们之后调用的是第二个方法(第一个方法只是我按照api说明随手写了一下),这些参数我们以POST的形式发送,按照百度OCRapi 的要求,需要加上@FormUrlEncode注释,我们使用@Field的方式将参数加入请求体。可以看到Observable中的是RecognitionResultBean类型,我们可以从里面拿到服务器返回的文字识别信息。

      定义好这两个方法之后,我们便可以构造retrofit对象进行调用

     Retrofit retrofit = new Retrofit.Builder()
                    .baseUrl("https://aip.baidubce.com/")
                    .addConverterFactory(GsonConverterFactory.create())
                    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                    .build();
    
            baiduOCRService = retrofit.create(BaiduOCRService.class);
    

      我们来看一下 rxjava+retrofit 在接口方法中的具体实现

      @Override
        public void getRecognitionResultByImage(Bitmap bitmap) {
    
            String encodeResult = bitmapToString(bitmap);
    
            baiduOCRService.getRecognitionResultByImage(ACCESS_TOKEN,encodeResult)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Observer<RecognitionResultBean>() {
                        @Override
                        public void onSubscribe(Disposable d) {
    
                        }
    
                        @Override
                        public void onNext(RecognitionResultBean recognitionResultBean) {
                            Log.e("onnext",recognitionResultBean.toString());
                            StringBuilder s = new StringBuilder();
                            List<RecognitionResultBean.WordsResultBean> wordsResult = recognitionResultBean.getWords_result();
                            for (RecognitionResultBean.WordsResultBean words:wordsResult) {
                                s.append(words.getWords());
                            }
    
                            mView.updateUI(s.toString());
    
                        }
    
                        @Override
                        public void onError(Throwable e) {
                            Log.e("onerror",e.toString());
                        }
    
                        @Override
                        public void onComplete() {
    
                        }
                    });
    
        }
    

      可以看到传入了一个Bitmap类型的图片参数,这个参数经过 String encodeResult = bitmapToString(bitmap); 方法转成了String类型。是因为接口要求的参数数据为String类型,所以我们对图片进行了base64转码,具体的转码方法如下:

        private String bitmapToString(Bitmap bitmap){
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
            byte[] bytes = baos.toByteArray();
            return Base64.encodeToString(bytes, Base64.DEFAULT);
        }
    

      调用此方法,便可以把图片类型转化成字符串类型,之后的操作便是对网路接口调用之后的回调方法进行定义,我们在调用成功后的onNext操作中,拿到了RecognitionResultBean类型参数,这个参数里含有图片所包含文字的信息,我们将所有的文字一一取出,用StringBuilder连接成一个字符串,返回给View层,调用View层的updateUI进行UI界面的更新,对于这个字符串我们在之后还可以进行进一步的分析操作。

      以上,百度OCR接口请求模块定义部分便已完成,接下来,我们要做的就是调用系统的相机功能,拍照得到照片,将照片传递给我们上面定义的请求接口,进行文字识别。

    相机功能调用

      首先,由于要对相机功能进行调用,我们需要在AndroidManifest清单文件中写明我们需要用到的权限

        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.CAMERA"/>
    

      分别是网络请求权限,数据的读存取权限,以及相机权限。在Android 6.0 之前应用的权限在安装时全部授予,也就是说只要在AndroidManifest中申请过的权限,都会给予。而在 Android 6.0 或更高版本之后,对权限的管理作出了改变,对某些涉及到用户隐私的权限可在运行时根据用户的需要动态授予,也就是说,在AndroidManifest中申请的权限,在用户使用的过程中还得询问用户是否给予,用户给予权限了,应用才能进行相关的权限操作。因此我们需在代码中增加动态权限申请的模块(对用户安全性友好了,但是对开发者增加了不友好度....),以下是动态权限申请部分的代码:

        private boolean hasPermission() {
            if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED
                    || ContextCompat.checkSelfPermission(this,Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.CAMERA}, PERMISSIONS_REQUEST_CODE);
                return false;
            }else {
                return true;
            }
        }
    

      代码的主要逻辑是,在程序运行的时候,检查是否有相应的权限,如果有权限,则可以进行相关操作,如果没有权限,就调用申请权限的方法。在完成这部分代码的编写之后还需重写onRequestPermissionsResult方法,对申请权限的结果进行反应。

      接下来是调用相机功能的代码

     private void takePhoto(){
    
            if (!hasPermission()) {
                return;
            }
    
            Intent intent = new Intent();
            intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);
            String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/img";
            if (new File(path).exists()) {
                try {
                    new File(path).createNewFile();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String filename = new SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date());
            mTmpFile = new File(path, filename + ".jpg");
            mTmpFile.getParentFile().mkdirs();
    
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                String authority = getPackageName() + ".provider";
                imageUri = FileProvider.getUriForFile(this, authority, mTmpFile);
            } else {
                imageUri = Uri.fromFile(mTmpFile);
            }
            intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    
            startActivityForResult(intent, CAMERA_REQUEST_CODE);
    
        }
    

      需要提到的是,在Android 7.0之后,如果你使用Intent携带这样的上面的imageUri去打开相机拍照,会抛出FileUriExposedException异常。这时候就需要用到google官方的解决方案——FileProvider。使用的方法可以参照 Android 7.0适配-应用之间共享文件

      调用相机之后我们需要重写onActivityResult方法,对返回拍照结果进行处理,

        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            if (requestCode == CAMERA_REQUEST_CODE) {
                if (requestCode == RESULT_OK){
                    Bitmap photo = BitmapFactory.decodeFile(mTmpFile.getAbsolutePath());
                    mPresenter.getRecognitionResultByImage(photo);
                    imageView.setImageBitmap(photo);
                }
            }
        }
    

      如果拍照成功,我们就把照片作为参数传递给之前定义好的接口方法,调用进行图片文字识别。可以看到我还把照片放入imageview中方便与识别结果进行对比。等服务器成功返回识别结构之后,就会调用VIew层的updateUI,更新textview显示识别结果。

      至此,我们就完成了从拍照到拿到识别结果的全部功能。再来识别一下公交卡

     

    公交卡识别.jpg

      嗯,不错。

    最后

      这个demo实现了单纯的图片文字识别,就是把图片上的字读取了出来,在此之上我们可以进一步做很多有意思的事,比如用正则表达式把字符串里的一些字提取出来进行操作,像食品的营养成分表啊,发票单子啊,都可以拿来识别,将里面的有用信息提取出来,进行分析处理操作,将功能进一步扩展。
      当然,在实现这些功能之后,我们最后还是得感谢为我们提供轮子的大佬,哈哈。
      贴上本项目的github地址 reggie1996/CharacterRecognition

    展开全文
  • Android富文本编辑

    2020-02-17 11:45:52
    Android富文本编辑器,一款支持撤销、加粗、斜体、下划线、有序无序列表、对齐、改文字大小、改文字颜色、插入图片、插入视频等功能,并且可设置cookie,自定义素材操作菜单的的编辑器。 github地址:...

    Android富文本编辑器,一款支持撤销、加粗、斜体、下划线、有序无序列表、对齐、改文字大小、改文字颜色、插入图片、插入视频等功能,并且可设置cookie,自定义素材操作菜单的的编辑器。

    github地址:https://github.com/yeaper/RichEditor

    演示

    1.控件使用

    RichEditor是富文本编辑器,EditorOpMenuView是操作栏控件,两个需要配合使用,xml引用方式如下:

    <com.yyp.editor.RichEditor
        android:id="@+id/editor"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    
    <com.yyp.editor.widget.EditorOpMenuView
        android:id="@+id/editor_op_menu_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

    两个控件最后需要绑定

    mEditorOpMenuView.setRichEditor(mEditor);
    

    2.编辑器相关设置

    //设置占位文字
    mEditor.setPlaceholder("请填写文章正文内容(必填)");
    //设置编辑器文字大小
    mEditor.setEditorFontSize(16);
    //设置编辑器内边距
    mEditor.setPadding(10, 10, 10, 10);
    //设置编辑器背景色
    mEditor.setBackgroundColor(UIUtils.getResources().getColor(R.color._ffffff));
    //禁止编辑 包括长按复制、双击选中、点击
    mEditor.disableEdit();
    //配置同一界面的焦点切换,可传多个输入框控件
    mEditor.hideWhenViewFocused((editText1, editText2, editText3, ...);
    

    3.编辑器操作

    //撤销
    mEditor.undo();
    //反撤销
    mEditor.redo();
    //加粗
    mEditor.setBold();
    //斜体
    mEditor.setItalic();
    //删除线
    mEditor.setStrikeThrough();
    //下划线
    mEditor.setUnderline();
    //设置文字颜色 传int色值
    mEditor.setTextColor(color);
    //设置文字大小 支持1-7字号
    mEditor.setFontSize(size);
    //左对齐
    mEditor.setAlignLeft();
    //居中对齐
    mEditor.setAlignCenter();
    //右对齐
    mEditor.setAlignRight();
    //两端对齐
    mEditor.setAlignFull();
    //有序列表
    mEditor.setNumbers();
    //无序列表
    mEditor.setBullets();
    //清除所有格式
    mEditor.removeFormat();
    
    //插入图片
    mEditor.insertImage("图片地址", "提示文字");
    //插入视频
    mEditor.insertVideoFrame("视频封面地址", videoId, "视频名字", size);
    //插入文本
    mEditor.insertHtml("文本内容");
    

    4.监听接口使用

    //编辑器焦点监听
    mEditor.setOnEditorFocusListener(new OnEditorFocusListener() {
        @Override
        public void onEditorFocus(boolean isFocus) {
            mEditorOpMenuView.displayMaterialsMenuView(false); //编辑器重获焦点,素材菜单要隐藏
            mEditorOpMenuView.setVisibility(isFocus ? View.VISIBLE : View.GONE);
        }
    });
    //编辑器文本输入回调
    mEditor.setOnTextChangeListener(new OnTextChangeListener() {
        @Override
        public void onTextChange(String text) {
            text.length();
        }
    });
    //监听素材菜单点击事件
    mEditorOpMenuView.setOnMaterialsItemClickListener(new OnMaterialsItemClickListener() {
    
        @Override
        public void onMaterialsItemClick(MaterialsMenuBean bean) {
            switch (bean.getId()){
                case MATERIALS_IMAGE: //从素材图片库选择
                    break;
                case MATERIALS_VIDEO: //从素材视频库选择
                    break;
                case MATERIALS_TXT: //从素材文字库选择
                    break;
                case LOCAL_IMAGE: //从本地图片库选择
                    break;
                case LOCAL_VIDEO: //从本地视频库选择
                    break;
            }
        }
    });
    

    5.遇到的问题与解决方案

    问题: 编辑器展示的图片访问不了,需要传cookie验证

    解决方案: 先前试过在WebViewClient的shouldInterceptRequest方法中,针对url设置cookie,但是cookie同步不及时,导致部分图片无法加载,后来考虑在加载图片前,先设置cookie,那么得出解决方案,先清除原来的cookie,然后为图片的ip地址设置新cookie,就可以访问了,这个方法在Webview.loadUrl()方法前调用即可。(注:android5.0以上记得打开cookie开关)

     //打开cookie
    android.webkit.CookieManager cookieManager = android.webkit.CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        cookieManager.setAcceptThirdPartyCookies(this, true);
    }
    
    private void addCookies(String url) {
        CookieManager cookieManager = CookieManager.getInstance();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            cookieManager.removeSessionCookies(null);
            PersistentCookieStore cookieStore = new PersistentCookieStore(UIUtils.getContext());
            for (Cookie cookie : cookieStore.getCookies()) { //添加cookie
                cookieManager.setCookie(url, String.format("%s=%s", cookie.name(), cookie.value()));
            }
            cookieManager.flush();
        }
    }
    

    问题: 为了方便编辑,图片、视频之间需要保持间距

    解决方案: css样式文件中,设置margin边距即可

    /* 图片和视频:宽度占满,高度自适应,下边距3px */
    IMAGE,img,video {
        width: 100% !important;
        height: auto;
        margin: 0px 0px 3px 0px !important;
    }
    
    展开全文
  • 照片加文字首先很多人都没注意到的是,我们在朋友圈发送图片时,都有一个编辑功能,那么我们就利用这个编辑功能,给照片添加文字。点开发送朋友圈页面,然后在相册中选择照片,点击下方"编辑"功能,选择和图片颜色相...

    照片加文字以及照片拼接,用微信就能做到,太方便了

    相信大家在端午佳节的时候,都拍摄了很多照片,分享到朋友圈,但是拍摄的图片太多,微信朋友圈只能发9张。

    今天就来教大家如何用微信就照片添加文字和拼接长图。

    照片加文字

    首先很多人都没注意到的是,我们在朋友圈发送图片时,都有一个编辑功能,那么我们就利用这个编辑功能,给照片添加文字。

    点开发送朋友圈页面,然后在相册中选择照片,点击下方"编辑"功能,

    072699077bb55688bdf0e4dea4a7eb06.png

    选择和图片颜色相近的字体颜色,然后给照片添加文字。

    和笔者一样直接用键盘编辑一下给可以啦,最后点击上方"完成"按钮,就能将文字照片分享到朋友圈。

    1958a4fb46e73831b5d7c589ab1e7873.png

    照片的风格添加不同的文章

    0301e87421f4952c7ae388472da40664.png

    一些简短却很浪漫的文案

    • 总有人,山高路远,为你而来
    • 你看一晃两三年 匆匆又夏天
    • 平安喜乐,得偿所愿
    • 人生苦短,及时行乐

    如果你觉得微信自带的编辑功能,文字等太单一,没有你想要的特效效果,那么也可以使用"清爽视频编辑",将照片加文字、加音乐、加特效,将静态的方式变成动态的方式展示出来,再进行分享朋友圈也是可以的。

    首先我们选中几张好看的图片,然后编辑成相册,添加各种样式的文字,文字颜色也能编辑,文字气泡样式等等。

    c465b7539d76b3b3a61e225533f20dda.png

    然后进行模板、文字、照片、滤镜、音乐的添加。

    一张照片由静态变成动态,照片的观赏度大大提高。

    b4bb2f066bc2d94d3c4f407bf9da679b.png

    PS:如果照片较多,有几十张那么也可以通过上传"电子相册"的方式进行编辑哦。

    拼接长图

    朋友圈只能一次性分享9张照片,要么挑选最喜欢的9张,要么就可以选择拼接图片的方式,一次性分享几十张。

    操作方法:

    微信——我的——收藏功能,点击右上角+号,然后选择"相册"图标,上传9张照片,就会自动拼接成一张,可以保存到手机相册,也能直接分享到朋友圈。

    00c97f4e9a5be117c9376a2c53772962.png

    PS:一次性可上传9张图片,进行拼接,超过9张不予展示。

    不过这么算下来,我们可以在朋友圈发送81张照片。

    c078d19a3b0c06360584963ce6c5e7db.gif

    图片上传完成后,点击右上角"..."符号,选择导出图片,当然直接分享长图到朋友圈也是可以的。

    除了拼接长图,也能进行照片样式排版,"长图片"和"正方形图片"。

    346a768720fc8155bfe767b8d1be5495.png

    长方形

    6f2a650c9bc2ac819a11582d17f9b9c9.png

    正方形样式展示。

    0131277848394c25b802037380557c04.png

    微信就能拼接长图和给图片添加文字,简单又好看,确定不学一下吗?

    展开全文
  • 一个Android富文本类库,支持编辑和预览,支持修改文字大小,各种样式(斜体,加粗。。。)、支持插入和删除图片
  • android 自定义横向文字跑马灯控件

    千次阅读 2017-07-31 11:25:21
    欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...

    。# android 自定义横向文字跑马灯控件

    android TextView 控件可以直接设置文字横向滚动效果,类似跑马灯效果。但原生效果局限相比较大,比如无法控制滚动速度,无法监听滚动结束时的状态,无法切换暂停/开启等。由于项目需要就定义了一个,可以实现上述功能,如果需要其他功能也很方便做扩展。内容很简单直接上代码:

    自定义view HorizontalScrollTextView

    
    public class HorizontalScrollTextView extends TextView implements View.OnClickListener { 
      private float textLength = 0f;// 文本长度
      private float viewWidth = 0f;//文本控件的长度
      private float step = 0f;// 文本的横坐标
      private float y = 0f;// 文本的纵坐标
      public boolean isStarting = false;// 是否开始滚动
      private Paint paint = null;
      private String text = "";// 文本内容
      private OnScrollCompleteListener onScrollCompleteListener;//滚动结束监听
    
      public HorizontalScrollTextView(Context context) {
         super(context);
         initView();
      }
    
      public HorizontalScrollTextView(Context context, AttributeSet attrs) {
           super(context, attrs);
           initView();
        }
    
      public HorizontalScrollTextView(Context context, AttributeSet attrs, int defStyle) {
           super(context, attrs, defStyle);
           initView();
      }
    
     public OnScrollCompleteListener getOnSrollCompleteListener() {
           return onScrollCompleteListener;
     } 
    
     public void setOnScrollCompleteListener(OnScrollCompleteListener  onScrollCompleteListener){
          this.onScrollCompleteListener = onScrollCompleteListener;
    }
    
     private void initView() {
            setOnClickListener(this);
     }
    
     public void init(WindowManager windowManager) {
       paint = getPaint();
       //设置滚动字体颜色
       paint.setColor(Color.parseColor("#f41301"));
       text = getText().toString();
       textLength = paint.measureText(text);
       viewWidth = getWidth();
       if (viewWidth == 0) {
         if (windowManager != null) {
            Display display = windowManager.getDefaultDisplay();
            viewWidth = display.getWidth();
           }
          }
            y = getTextSize() + getPaddingTop();
        }
        //开启滚动
      public void startScroll() {
         isStarting = true;
         invalidate();
      }
      //停止滚动
      public void stopScroll() {
         isStarting = false;
         invalidate();
      }
    
      @Override
      public void onDraw(Canvas canvas) {
           canvas.drawText(text,  - step, y, paint);
           if (!isStarting) {
               return;
            }
           step += 2.0;// 2.0为文字的滚动速度
           //判断是否滚动结束
           if (step > textLength){
               step = 0;
               onScrollCompleteListener.onScrollComplete();
           }
             invalidate();
       }
    
     //控制点击停止或者继续运行
      @Override
      public void onClick(View v) {
              if (isStarting)
                stopScroll();
              else
                startScroll();
       }
    
       public interface OnScrollCompleteListener {
             void onScrollComplete();
       }
    }

    然后直接在xml文件里引用,最后在代码中就可以控制使用了

      horizontalScrollTextView.setText(“这是一段可以横向滚动的广告文本);
      horizontalScrollTextView.init(getActivity().getWindowManager());
      horizontalScrollTextView.startScroll();

    设置结束监听

    horizontalScrollTextView.setOnScrollCompleteListener(newHorizontalScrollTextView.OnScollCompleteListener(
            {
                   @Override
                   public void onScrollComplete() {
                      Log.e("zsw", "我跑完拉!");
                  }
     });   

    第一次写博客,功能很简单,不足之处多多包涵。

    展开全文
  • 欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 ...
  • 无水印剪辑支持短视频去水印、图片去水印、视频裁剪、视频剪辑、视频图片加水印文字加图涂鸦工具! 1、支持一键解析提取无水印视频,全面支持 绝大多数视频app平台的 完美水印处理 2、支持“抹除水印”,选择有水印的...
  • Android-Rich-text-Editor.zip

    2019-09-23 09:42:35
    Android-Rich-text-Editor.zip,目前支持的样式: 加粗 斜体 下划线 删除线 有序列表 无序列表 左对齐 居中对齐 右对齐 插入图片 文字背景色 插入超链接 @功能 引用 文字颜色(前景色) 插入表情 ...
  • 修改文字贴纸的文字编辑页面中,底部操作栏的背景色为固定色值(其实也可以改,看看EasyPhotos的color文件你就知道怎么改) 2.1.0: 新增功能:EasyPhotos智能识别状态栏的背景颜色,当其趋近于白色时,智能适配...
  • 当需要一个图片右边文字的时候尤其是很多Listview的Item,很多时候我们是一个用layout嵌套一个ImageView和TextView,这时候xml编辑器会提示can be replaced by one and a compound drawable什么的,就是提醒我们可以...
  • 今天给大家来一款手机端的PDF文件编辑神器,“PDF处理助手”,不过这款软件目前只有Android端的喔,ios的小...软件支持九大基本功能:PDF转Word、文字提取、PDF转图片、PDF文件拆分、PDF合并、PDF水印、PDF解密...
  • -云推送:可把网页中的图片文字、链接发送到其他任意指定设备; -云下载:可把下载到的文件上传至云端,在任意设备均可直接获取; -云标签:任意设备上均可浏览所有其他设备打开的标签; -云同步:随时保持不同...
  • APKTool批处理版l

    2011-10-26 13:58:55
    (一)一些软件中界面没有使用文字,而是调用的图片(这在游戏软件中更多见),对于此类界面的汉化,请参考替换图标,直接用同尺寸的图片替换就可以了。 (二)有的软件本身支持多语种,这样可能会在res文件夹下会...
  • 视频处理SDKAndroid文字水印、png图片水印; 音频处理SDKAndroid回音消除、噪音抑制、自动增益、VAD检测模块; iOS端 RTMP直播推流端SDK iOS屏幕(基于ReplayKit)、摄像头RTMP推流SDK; RTSP直播推流SDK ...
  • 黑马安卓52期视频教程

    热门讨论 2015-06-24 22:15:48
    6.广告轮播(动态切换dot和文字) 7.1广告轮播(伪无限循环) 7.2广告轮播(伪无限循环) 8.下拉选择(填充数据) 9.下拉选择(处理点击和删除) 1.下拉刷新(填充数据和隐藏headerView) 2.下拉刷新(在TouchMove中显示...
  • 新增iPhone和Android手机客户端下载地址可通过扫描二维码实现下载(更加方便的实现下载到手机了) 新增后台可设置附件类型 修复网站安全问题(感谢 秒杀@360 、 合肥滨湖虎子@360 的反馈) 修复发布某些字符的...
  • 新增iPhone和Android手机客户端下载地址可通过扫描二维码实现下载(更加方便的实现下载到手机了) 新增后台可设置附件类型 修复网站安全问题(感谢 秒杀@360 、 合肥滨湖虎子@360 的反馈) 修复发布某些字符的...
  • -云推送:可把网页中的图片文字、链接发送到其他任意指定设备; -云下载:可把下载到的文件上传至云端,在任意设备均可直接获取; -云标签:任意设备上均可浏览所有其他设备打开的标签; -云同步:随时保持不同...
  • -去图片编辑工具条; -去主菜单“传文件到手机”、“导出手机相册”相关提示文字; -去“离线请留言”提示文字; -去“好友推荐”蓝条; -去“打字聊天不尽兴?试试群视频吧!”蓝条; -去“启用云消息服务,显示...
  • 确然转码大师 v3.3.zip

    2019-07-08 12:52:39
    可以添加文字图片水印,支持各种效果; 可以添加字幕文件; 支持对音视频进行加密处理。加密处理的音视频必须经解密后方可播放。 7、支持各种移动终端的音视频转码器,输出mp4、3gp、f4v...
  • 确然转码大师 v3.3

    2019-03-07 13:12:59
    可以添加文字图片水印,支持各种效果; 可以添加字幕文件; 支持对音视频进行加密处理。加密处理的音视频必须经解密后方可播放。 7、支持各种移动终端的音视频转码器,输出mp4、3gp、f4v格式 支持家用电脑、...
  • Java数组倒置 简单 Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印 util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印...
  • JAVA上百实例源码以及开源项目

    千次下载 热门讨论 2016-01-03 17:37:40
    Java图片加水印,支持旋转和透明度设置 摘要:Java源码,文件操作,图片水印  util实现Java图片水印添加功能,有添加图片水印和文字水印,可以设置水印位置,透明度、设置对线段锯齿状边缘处理、水印图片的路径,水印...
  • 文字表情制作器:一键制作文字表情 2019年10月30号添加 何辉(深圳) - Github ✅ 相见易:允许用户在手机上、网页上自主设计表单、图表,存储和查询数据、网页与手机端的数据互通(演示用户:13510928305...
  • 可以添加文字图片水印,支持各种效果; 可以添加字幕文件; 支持对音视频进行加密处理。加密处理的音视频必须经解密后方可播放。 7、支持各种移动终端的音视频转码器,输出mp4、3gp、f4v格式 支持家用电脑、...
  • 联系方式:QQ:517216493 微信:feiyangqingyun QQ好友满了推荐微信 视频相关作品体验地址:https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g 提取码:01jf 其他相关作品体验地址:...

空空如也

空空如也

1 2 3
收藏数 48
精华内容 19
关键字:

android图片编辑加文字