• Android 左飞字幕的实现(带描边)


    废话不多说,直接上代码:

    public class FiveTextView extends TextView {
        /** 文字长度 */
        private float textLength = 0f;
        /** 滚动条长度 */
        private float viewWidth = 0f;
        /** 文本x轴 的坐标 */
        private float tx = 0f;
        /** 文本Y轴的坐标 */
        private float ty = 0f;
        /** 文本当前长度 */
        private float temp_tx1 = 0.0f;
        /** 文本当前变换的长度 */
        private float temp_tx2 = 0x0f;
        /** 文本滚动开关 */
        private boolean isStarting = false;
        /** 画笔对象 */
        private Paint paint = null;
        /** 显示的文字 */
        private String text = "";
        /** 文本滚动速度 **/
        private float sudu;
    
        private Paint strokPaint = null;
    
        private int strokeWidth;
    
        private int a;
    
        private int r;
    
        private int g;
    
        private int b;
    
        private int sa;
    
        private int sr;
    
        private int sg;
    
        private int sb;
    
    
        public FiveTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        /**
         * 初始化自动滚动条,每次改变文字内容时,都需要重新初始化一次
         *
         *            显示的内容
         * @param
         *
         */
    
        private void init() {
    
            strokPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    
            //设置抗锯齿
            strokPaint.setAntiAlias(true);
    
            //设置防抖动
            strokPaint.setDither(true);
    
            //设置填充方式
            strokPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    
        }
        public void initScrollTextView(WindowManager windowManager, String text,
                                       float su,int a,int r,int g,int b,int height,String strokewidth,String strokecolor,int textsize) {
            // 得到画笔,获取父类的textPaint
            paint = this.getPaint();
            init();
            if (!"".equals(strokecolor)){
                String substring = strokecolor.substring(strokecolor.indexOf("(")+1, strokecolor.indexOf(")"));
                String trim = substring.replaceAll("\\s+","");
                String[] split1 = trim.split(",");
                this.sa = 255;
                this.sr = Integer.parseInt(split1[0]);
                this.sg = Integer.parseInt(split1[1]);
                this.sb = Integer.parseInt(split1[2]);
            }
            this.a = a;
            this.r = r;
            this.g = g;
            this.b = b;
    
            if (!"".equals(strokewidth)){
                this.strokeWidth = Integer.parseInt(strokewidth);
            }
            strokPaint.setTextSize(textsize);
            // 得到文字
            this.text = text;
            this.sudu = su;
            textLength = paint.measureText(text);// 获得当前文本字符串长度
            viewWidth = this.getWidth();// 获取宽度return mRight - mLeft;
            if (viewWidth == 0) {
                // 获取当前屏幕的属性
                Display display = windowManager.getDefaultDisplay();
                viewWidth = display.getWidth();// 获取屏幕宽度  viewWidth 是滚动的开始位置,需要修改的
                // 可再此入手
            }
            tx = textLength;
            temp_tx1 = viewWidth + textLength;
            temp_tx2 = viewWidth + new Double(textLength*2.8).intValue();// 自己定义,文字变化多少
            ty = height/2+this.getTextSize()/2;
    
            starScroll();
        }
    
        /**
         * 开始滚动
         */
        public void starScroll() {
            // 开始滚动
            isStarting = true;
            this.invalidate();// 刷新屏幕
        }
    
        /**
         * 停止方法,停止滚动
         */
        public void stopScroll() {
            // 停止滚动
            isStarting = false;
            this.invalidate();// 刷新屏幕
        }
    
        /** 重写onDraw方法 */
        @Override
        protected void onDraw(Canvas canvas) {
    
            if (isStarting) {
                strokPaint.setTextAlign(Paint.Align.CENTER);
                strokPaint.setStrokeWidth(strokeWidth);
                strokPaint.setARGB(sa,sr,sg,sb);
                canvas.drawText(text, temp_tx1 - tx, ty, strokPaint);
                // A-Alpha透明度/R-Read红色/g-Green绿色/b-Blue蓝色
                strokPaint.setARGB(a,r,g,b);
                strokPaint.setStrokeWidth(0);
                canvas.drawText(text, temp_tx1 - tx, ty, strokPaint);
                tx += sudu;
                // 当文字滚动到屏幕的最左边
                if (tx > temp_tx2) {
                    // 把文字设置到最右边开始
                    tx = textLength;
                }
                this.invalidate();// 刷新屏幕
            }
    //        super.onDraw(canvas);
        }
    } 

    在activity中使用:

    FiveTextView fiveTextView = new FiveTextView(MainActivity.this, null);
    fiveTextView.initScrollTextView(getWindowManager(),"会移动的描边字幕",3,255,98,0,238,350,"2","rgba(255,13,13,1)",30);
    
    mParams.x = 0;
    mParams.y = 0;
    mParams.width = 1000;
    mParams.height =350;
    wManager.addView(fiveTextView,mParams);

    附加:

    windowmanager初始化方法:

    private void initWindowManager() {
        wManager = (WindowManager) getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
        mParams = new WindowManager.LayoutParams();
        mParams.gravity = Gravity.TOP | Gravity.LEFT;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            mParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
        }else {
            mParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
        }
        mParams.format = PixelFormat.TRANSLUCENT;
        mParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN
                | WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
    }

    完事,收工!

  • 相关阅读:
    Apriori算法
    基于lammps的工件-轧辊组合模型轧制过程模拟
    网络安全之内容安全
    Mybatis 升级为Mybatis Plus + JPA
    操作系统进程调度算法的模拟实现(c语言版本)
    海外多IP物理服务器租用
    安防初识命令【学习笔记】
    11-09 周四 机器学习开发容器搭建
    力扣-461.汉明距离
    VB.NET—DataGridView控件教程详解
  • 原文地址:https://blog.csdn.net/wuchengyayo/article/details/125406123