精华内容
下载资源
问答
  • 以前不想发带照片的朋友圈的时候,竟然不会发~ 1,朋友圈界面~ 点击次那个照相机图标 ,是 发带图片的朋友圈~ 2,长按照相机图标5秒左右~就会弹出只让你发表文字的界面! 然后,就输入文字就好啦~ 示例:...

    偶然间发现的一个事情,觉得好玩就记录下来啦。
    以前不想发带照片的朋友圈的时候,竟然不会发~
    1,朋友圈界面~
    点击一次那个照相机图标 ,是 发带图片的朋友圈~
    在这里插入图片描述
    2,长按照相机图标5秒左右~就会弹出只让你发表文字的界面!
    在这里插入图片描述
    然后,就输入文字就好啦~
    示例:
    在这里插入图片描述

    展开全文
  • 对于艺术字和文字特效大家一定陌生,对于英文来说,实现各种艺术字很简单,因为英文只有26个字母,加上阿拉伯数字也就几十个,只需要设计个字体库生成ttf文件提供给各个平台加载就可以了。但是对于汉字来说,...
    对于艺术字和文字特效大家一定不陌生,对于英文来说,实现各种艺术字很简单,因为英文只有26个字母,加上阿拉伯数字也就几十个,只需要设计一个字体库生成ttf文件提供给各个平台加载就可以了。但是对于汉字来说,文字量巨大,针对每个汉字设计ttf实在不是理想的选择。而最近项目需要汉字的文字特效和动画效果,因此自己实现了一个Android平台的文字特效和动画效果库。


    先几个简单的效果图





    上图中只是几个自己实现的简单的特效demo,这个库好处是可以创造属于自己的特效字体。下面我们来说说怎样创建自己的字体特效:


    1.demo和库可以在github上下载:点击打开链接
    2.demo中点击“创建字体模版”就可以进入创建模版的页面。
    3.对于文字特效模版我们可以对照ps软件,每个文字其实是有很多层叠加起来的,从而实现了很多效果,例如上图的缩放效果就是由多个不同大小和透明度的文字层叠加而成。
    对于上图中抖音效果其实就是由三个不容颜色的文字层偏移叠加而成。
    4.每一层叠加的文字和android原生文字可以支持的效果是一样的,例如渐变,描边,阴影等等。
    5.不仅可以叠加文字,还可以叠加图片,如上图中倒数第二个例子,就是在文字下方叠加了一个背景图。
    6.此外,demo中还提供了切割和偏移等效果,即把文字切割成两部分或者多个部分做平移。实现的逻辑既是把多层文字看作一张图片做各种操作。
    7.完成文字特效后点击生成模版,取一个名字就可以保存到本地,在sd
    卡上FontDemo/data下面就可以找到对应的文字模版了。
    8.在需要文字模版的app中只要用github下载的demo中的库内的STextView加载相应的模块,即可以显示对应的文字特效了。
    9.除了静态特效,还提供了一个动画特效的框架,上图是本人实现的几个简单的动画特效,需要的话可以自行拓展。动画特效没有支持生成模版,是在代码中实现的,需要的也可以生成模版使用。



    展开全文
  • 写在最前本次分享个用canvas粒子渲染文字的“完整”版实现,功能包括:随机粒子缓动画,粒子汇聚、发散,并拼出你要的文字。本文继续上面一节基于canvas使用粒子拼出你要的文字的基础效果,完善了在文字拼接...

    写在最前

    本次分享一个用canvas粒子渲染文字的“完整”版实现,功能包括:随机粒子缓动动画,粒子汇聚、发散,并拼出你想要的文字。本文继续上面一节基于canvas使用粒子拼出你想要的文字的基础效果,完善了在文字拼接过程中的粒子效果。

    欢迎关注我的博客,不定期更新中——

    上节回顾

    自上次的分享基于canvas使用粒子拼出你想要的文字,我们实现了一个可配置的用粒子拼出想要的文字效果,不过这个效果是静态的,就像这样:
    image

    这次我们试图对它进行了一些完善,让其可以尽量完整的实现我们的诉求。

    效果图

    惯例直接看下效果图:

    2017-12-18 14_38_18

    这是一个事先配置好的动画效果用来展示一下粒子的完整运动轨迹。在这个例子中我们做了以下几件事:
    - 初始化一定数量的粒子,开始缓动
    - 监听到输入事件后,拼出相应文字。其拼接的粒子是从缓动中的随机粒子抽取,如果不够则新加粒子
    - 当再次监听到输入事件后,原文字散开到随机位置,新文字按照上一步进行绘制,以此往复

    故本次我们讨论的重点则围绕缓动动画与粒子的汇聚与散开进行展开

    整体逻辑

    先来分析一下整体的实现思路

    1、首先为了增加粒子的重用性,不需要每次拼新的文字都new一堆新的粒子。故选择维护了两个数组进行存放相应粒子。即随机缓动数组与展示效果数组

    2、初始化一定数目粒子,粒子位置随机,半径随机,加入到随机粒子数组

    3、对加入到随机粒子数组中的对象执行缓动动画

    4、监听事件被触发,清空展示粒子数组,将当前页面所有粒子全部加入到随机粒子数组,同时更新粒子状态,让每个粒子重新出现在各个随机位置

    5、当拼接文字开始,每次需要绘制一个粒子到拼接的地点时则从随机粒子数组中pop出一个粒子对象,更新粒子的位置等信息,push到展示粒子数组中,如果随机粒子数组数量不够,则新建对象添加到展示粒子数组。

    6、展示粒子数组中的粒子收集完毕后,遍历数组依次渲染到指定位置

    新的监听事件被触发重复以上的4、5、6步骤

    实现核心

    • 随机粒子的缓动动画
    • 从随机粒子变为展示粒子的过程中,需要绘制出粒子的运动轨迹以实现发散与汇聚的效果

    缓动动画

    就像下面这样:

    2017-12-18 17_35_26

    观察其中一个粒子的动画行为可以发现缓动动画实现核心点在于:起始速度快,之后速度逐步递减,直至停下

    所以速度是与起始点与中点距离相关的,距离越大,速度越快,反之亦然。那么我们的速度就可以表示为:相对路程 ✖️ 缓动系数(一个小数),即可使每一帧的位移距离从大到小,速度从快至慢。

    代码实现:

    首先初始化了一些随机的粒子:

    for(var i = 0; i < 100; i++) {
        var option = {
            radius: ~~(Math.random() * 3) + 1,
            x: ~~ (Math.random() * canvas.width),
            y: ~~ (Math.random() * canvas.height),
            color: 'rgba(255, 255, 255, 0.5'
        }
        var bubble = new Bubble(option)
        circleArr.push(bubble)
    }

    之后再绘制粒子缓动:

    var dis = ~~ Math.sqrt(Math.pow(Math.abs(this.x - this.randomX), 2) + Math.pow(Math.abs(this.y - this.randomY), 2)),
        ease = 0.05
        ...
     if( dis > 0) {
        //当粒子在向目标点移动的过程中,由缓动系数与距离控制速度
        if(this.x < this.randomX) {
            this.x += dis * ease 
        } else {
            this.x -= dis * ease 
        }
        if(this.y < this.randomY) {
            this.y += dis * ease 
        } else {
            this.y -= dis * ease 
        }
        } else {
        //达到目标点后更新下一个目标点
        this.randomX += ~~(Math.random() * (Math.random() > 0.5 ? 5 : -5) * 2)
        this.randomY += ~~(Math.random() * (Math.random() > 0.5 ? 5 : -5) * 2) 
        }
        ctx.beginPath()
        ctx.arc(this.x, this.y, this.originRadius, 0, 2 * Math.PI, false)
        ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'
        ctx.fill()
    }
    ...

    粒子的发散与汇聚

    每一个粒子都会经历由随机粒子 => 展示粒子 => 随机粒子的过程,在这其中我们需要控制好,粒子的坐标,由于在文字与随机移动的切换中,均为缓动效果实现。故我们不单单要在每个状态改变的时候维持好下一个状态下该粒子的坐标,还应该同步保持一个坐标的副本。由于需要通过两个状态下的坐标值算出需要移动的距离,并且这个距离是固定的,所以在状态切换的过程中不能改变这两个坐标值,但是粒子时刻在动,故我们需要一个坐标副本来实时表示当前的粒子坐标位置。

    ...
    if(this.isWord) { //如果该粒子当前是文字
        var disLastPosition = ~~ Math.sqrt(Math.pow(Math.abs(this.lastX - this.randomX), 2) + Math.pow(Math.abs(this.lastY - this.randomY), 2))
        var ease = 0.05
        if (disLastPosition > 0) {
            if (this.lastX < this.randomX) {
                this.lastX += disLastPosition * ease
            } else {
                this.lastX -= disLastPosition * ease
            }
            if (this.lastY < this.randomY) {
                this.lastY += disLastPosition * ease
            } else {
                this.lastY -= disLastPosition * ease
            }
        } else {
            this.lastX = this.randomX
            this.lastY = this.randomY
            this.x = this.lastX //更新x,y值
            this.y = this.lastY
            this.isWord = false
        }
        ctx.beginPath()
        ctx.arc(this.lastX, this.lastY, this.originRadius, 0, 2 * Math.PI, false)
        ctx.fillStyle = 'rgba(255, 255, 255, 0.5)'
        ctx.fill()
        return
    }
    ...

    此时我们使用lastX,lastY属性来作为前一个坐标值的变量,在计算出位移距离后,通过改变lastX,lastY来实现粒子的动画效果,当粒子到达指定位置后再更新x,y的坐标为新的坐标。

    小结

    至此我们大体完成了一个完整的粒子文字特效,当然和一些线上炫酷的��不能比,不过大体是那么个意思,代码细节部分有兴趣的同学可以参照源码(见最后),或者自己实现一版玩玩~

    其他canvas相关文章

    最后

    源代码见:这里

    惯例po作者的博客,不定时更新中——

    有问题欢迎在issues下交流。

    展开全文
  • Android自定义组件系列【8】——遮罩文字动画

    千次阅读 多人点赞 2014-06-15 20:02:03
    篇文章我们来看看如何自定义个ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧。(录屏幕延时导致效果看起来不是很好)、实现原理 实现原理是重写View的onCreate方法,获取图片...

    遮罩文字的动画我们在Flash中非常常见,作为Android的应用开发者你是否也想将这种动画做到你的应用中去呢?这一篇文章我们来看看如何自定义一个ImageView来实现让一张文字图片实现文字的遮罩闪烁效果,下面先来看看效果吧。


    (录屏幕延时导致效果看起来不是很好)

    一、实现原理

      实现原理是重写View的onCreate方法,获取图片资源后对每个像素的透明度进行修改来实现,再启动一个线程来循环改变某个区域中的像素透明度。

    RGBA基础知识:(下面几段介绍文字引用自维基百科)

      RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。虽然它有的时候被描述为一个颜色空间,但是它其实仅仅是RGB模型的附加了额外的信息。采用的颜色是RGB,可以属于任何一种RGB颜色空间,但是CatmullSmith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染alpha合成变得可能。提出者以alpha来命名是源于经典的线性插值方程αA + (1-α)B所用的就是这个希腊字母

      alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。在0%和100%之间的值则使得像素可以透过背景显示出来,就像透过玻璃(半透明性),这种效果是简单的二元透明性(透明或不透明)做不到的。它使数码合成变得容易。alpha通道值可以用百分比、整数或者像RGB参数那样用0到1的实数表示。

      有时它也被写成ARGB(像RGBA一样,但是第一个数据是alpha),是Macromedia的产品使用的术语。比如,0x80FFFF00是50%透明的黄色,因为所有的参数都在0到255的范围内表示。0x80是128,大约是255的一半。

    PNG是一种使用RGBA的图像格式。


    二、具体实现

    package com.example.helloworld;
    
    import android.content.Context;
    import android.content.res.TypedArray;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.os.Handler;
    import android.os.Message;
    import android.os.SystemClock;
    import android.util.AttributeSet;
    import android.view.View;
    import android.widget.ImageView;
    /**
     * @author 阳光小强
     *
     */
    public class SplashImageView extends ImageView{ 
        private Bitmap alterBitmap;  
        private Canvas canvas;  
        private Paint paint;  
    	private Handler handler;
    	private static int START_POSITION = 20;
    	private final int speed;
    	private int nowPosition = START_POSITION;
    	private static int SHOW_WIDTH = 20;
    	private boolean isFirst = true;
    	private boolean isStop = false;
    
        
    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = " + alterBitmap.getWidth());
    				if(nowPosition + speed >= alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    					if(isStop){
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					}else{
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if(!notifiDraw(nowPosition)){
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    	
    	private boolean notifiDraw(long position) {
    		System.out.println("nofityDrawToatal = " + position);
    		if(position < alterBitmap.getWidth() - START_POSITION - SHOW_WIDTH){
    			this.invalidate();
    			return true;
    		}
    		if (handler != null) {
    			handler.removeCallbacksAndMessages(null);
    			handler = null;
    		}
    		return false;
    	}
    	
    	@Override
    	public void setVisibility(int visibility) {
    		super.setVisibility(visibility);
    		if(visibility == View.VISIBLE){
    			if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }else{
    	        	handler.removeCallbacksAndMessages(null);
    	        	handler.sendEmptyMessage(MyHandler.MSG_PAINT);
    	        }
    		}else{
    			if(handler != null){
    				handler.removeCallbacksAndMessages(null);
    				handler = null;
    			}
    		}
    	}
    	
    	public void stopSplashAnimation(){
    		if(handler != null){
    			isStop = true;
    		}
    	}
    	
    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
            alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(), up.getConfig());  
               
            canvas = new Canvas(alterBitmap);   
            paint = new Paint();  
            paint.setStrokeWidth(5);  
            paint.setColor(Color.BLACK);  
            canvas.drawBitmap(up, new Matrix(), paint);  
              
            setImageBitmap(alterBitmap);  
           
            if(getVisibility() == View.VISIBLE){
            	if(handler == null){
    	        	handler =  new MyHandler(this);
    	        }
            }
    	}
    	
    	@Override
    	protected void onDraw(Canvas canvas) {
    		
    		super.onDraw(canvas);
    		
    		if(isFirst){
    			isFirst = false;
    			 for(int i=nowPosition; i<alterBitmap.getWidth() ; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);  
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		}
    	   
    		 for(int i=nowPosition; i<nowPosition + SHOW_WIDTH ; i++){  
                 for(int j=0; j<alterBitmap.getHeight(); j++){  
                     int color = alterBitmap.getPixel(i, j);  
                     int r = Color.red(color);  
                     int g = Color.green(color);  
                     int b = Color.blue(color);
                     int a = Color.alpha(color);
                     if(a == 80){
                    	 color = Color.argb(255, r, g, b);
                     }else{
                    	 color = Color.argb(a, r, g, b);
                     }
                     alterBitmap.setPixel(i, j, color);
                 }  
                 
             }  
            
    		 if(nowPosition > START_POSITION){
    			 for(int i= nowPosition - SHOW_WIDTH; i<nowPosition; i++){  
    	             for(int j=0; j<alterBitmap.getHeight(); j++){  
    	                 int color = alterBitmap.getPixel(i, j);         
    	                 int r = Color.red(color);  
    	                 int g = Color.green(color);  
    	                 int b = Color.blue(color);
    	                 int a = Color.alpha(color);
    	                 if( a > 200){
    	                	 color = Color.argb(80, r, g, b);
    	                 }else{
    	                	 color = Color.argb(a, r, g, b);
    	                 }
    	                 alterBitmap.setPixel(i, j, color);
    	             }  
    	             
    	         }  
    		 }
            setImageBitmap(alterBitmap);
    	}
    
    }
    
    三、实现详解

    1、构造方法中进行初始化操作

    	public SplashImageView(Context context, AttributeSet attrs) {
    		super(context, attrs);
    		TypedArray a = context.obtainStyledAttributes(attrs,
    				R.styleable.FuseImageView, 0, 0);
    		int resId = a.getResourceId(R.styleable.FuseImageView_imageSrc, 0);
    		int speed = a.getInt(R.styleable.FuseImageView_speed, 5);
    		this.speed = speed <= 0 ? 1 : speed;
    		Bitmap up = BitmapFactory.decodeResource(context.getResources(), resId);
    		alterBitmap = Bitmap.createBitmap(up.getWidth(), up.getHeight(),
    				up.getConfig());
    
    		canvas = new Canvas(alterBitmap);
    		paint = new Paint();
    		paint.setStrokeWidth(5);
    		paint.setColor(Color.BLACK);
    		canvas.drawBitmap(up, new Matrix(), paint);
    
    		setImageBitmap(alterBitmap);
    
    		if (getVisibility() == View.VISIBLE) {
    			if (handler == null) {
    				handler = new MyHandler(this);
    			}
    		}
    	}
    上面的TypedArray是自定义的属性,在res/values目录下新建一个attrs.xml添加自定义属性

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <declare-styleable name="FuseImageView">
            <attr name="imageSrc" format="reference" />
            <attr name="speed" format="integer" />
        </declare-styleable>
    </resources>
    这里是自定义的两个属性,一个是图片资源ID另一个是遮罩移动速度(其实上面也可以继承自View来实现自定义,我这里是有特殊需要才继承自ImageView的)

    然后通过BitmapFactory获取图片资源,并通过createBitmap方法创建一个可写的Bitmap资源给画布(Canvas),将可写的Bitmap绘制到同样资源的背景上。

    底下的判读View是否可看见,是用来判读View是否可见,如果可见才开启线程进行动画的,不然的话开启线程绘制会浪费资源的(因为它根本就看不见)。

    2、如何改变透明度并且绘制(onDraw方法)

    		for (int i = nowPosition; i < nowPosition + SHOW_WIDTH; i++) {
    			for (int j = 0; j < alterBitmap.getHeight(); j++) {
    				int color = alterBitmap.getPixel(i, j);
    				int r = Color.red(color);
    				int g = Color.green(color);
    				int b = Color.blue(color);
    				int a = Color.alpha(color);
    				if (a == 80) {
    					color = Color.argb(255, r, g, b);
    				} else {
    					color = Color.argb(a, r, g, b);
    				}
    				alterBitmap.setPixel(i, j, color);
    			}
    
    		}
    
    		if (nowPosition > START_POSITION) {
    			for (int i = nowPosition - SHOW_WIDTH; i < nowPosition; i++) {
    				for (int j = 0; j < alterBitmap.getHeight(); j++) {
    					int color = alterBitmap.getPixel(i, j);
    					int r = Color.red(color);
    					int g = Color.green(color);
    					int b = Color.blue(color);
    					int a = Color.alpha(color);
    					if (a > 200) {
    						color = Color.argb(80, r, g, b);
    					} else {
    						color = Color.argb(a, r, g, b);
    					}
    					alterBitmap.setPixel(i, j, color);
    				}
    
    			}
    		}
    主要是上面两个循环来实现绘制的,上面的循环是绘制一块区域来将文字的透明度调为最小(255),这一部分的文字就显示为高亮了,其余部分的文字透明度调值调为80,就会显示背景颜色,文字的暗度就会下降。

    3、如何循环移动遮罩

    	private class MyHandler extends Handler {
    
    		private static final long SCALE = 10000;
    		private static final int MSG_PAINT = 1;
    
    		private final SplashImageView owner;
    		private final int speed;
    
    		private long angle;
    		private long lastTime;
    
    		public MyHandler(SplashImageView owner) {
    			this.owner = owner;
    			this.lastTime = SystemClock.elapsedRealtime();
    			this.speed = owner.speed;
    			sendEmptyMessage(MSG_PAINT);
    		}
    
    		@Override
    		public void handleMessage(Message msg) {
    			if (msg.what == MSG_PAINT) {
    				long now = SystemClock.elapsedRealtime();
    				long delta_time = now - lastTime;
    				System.out.println("delta_time = " + delta_time);
    				System.out.println("alterBitmap.Width = "
    						+ alterBitmap.getWidth());
    				if (nowPosition + speed >= alterBitmap.getWidth()
    						- START_POSITION - SHOW_WIDTH) {
    					if (isStop) {
    						handler.removeCallbacksAndMessages(null);
    						handler = null;
    						isStop = false;
    						return;
    					} else {
    						nowPosition = START_POSITION;
    					}
    				}
    				nowPosition = nowPosition + speed;
    				if (delta_time > 0) {
    					if (!notifiDraw(nowPosition)) {
    						return;
    					}
    				}
    				this.sendEmptyMessageDelayed(MSG_PAINT, 10);
    			}
    		}
    	}
    循环移动遮罩是写在一个线程中的,每隔10毫秒就去移动speed(配置的速度)的距离,来实现遮罩的移动效果,再取图片的宽度来判断是否已经到了最右边。


    总结:其实上面的实现原理并不难,要点是要知道RGBA的知识和如何去改变像素的透明度。这个只是个人暂时想到的一个方法,如果有什么更好的方式实现,希望能交流一下。

    另外“阳光小强”的另一篇博文《是男人就下100层【第三层】——高仿交通银行手机客户端界面》参加了CSDN举办的博文大赛,如果您觉得这些博文对您有帮助,希望您投出您宝贵的一票,投票地址:http://vote.blog.csdn.net/Article/Details?articleid=30101091


    展开全文
  • 很多网友看批量图片识别成文字,用图片上的文字来修改文件名,今天他来了 因为解决就得手动挨个挨个输入然后把文件命名好 今天又个文件需求是这样的 图上有姓名文字,要识别出来改成每一张图跟这个一样,有...
  • div内图片文字水平垂直居中

    万次阅读 2017-11-29 17:32:36
    想必写css的都知道如何让单行文字在高度固定的容器内垂直居中,但是您知道或者过让行数固定的文字在高度固定的容器内垂直居中呢?本文将会告诉你如何实现多行文字的垂直居中显示。 关于图片垂直居中显示,想必很...
  •  其实还有种简单的导入文字资源的方式,只需要加载一张图片就行了,不过在这张图片中,每个字符或者空格都要占有相同大小的位置,还要定义好文字的位置,这样才可以使用,查看下面示例:   这是Phaser.RetroFont...
  • html的内容:    //图片  //提示文字  这里是新闻标题简要介绍一下吗       样式设置如下: //首先确定遮罩层的大小 .ih-i
  • 今天我在起草份简历,用到了文本框,因为文本框可以搞一些比较艺术的东东,当我把我的...我们不是知道有个操作可以把图片衬在文字下面吗? 就像这样: 问题又来了。。。他喵的这些竟然都点不动啊!!! 奇怪...
  • android标题栏、状态栏图标文字颜色及背景动态变化

    万次阅读 多人点赞 2017-06-22 14:22:30
    android中沉浸式状态栏的文章已经满大街了,可是在实现某些效果时,还是得各种搜索,测试一通后,最后还常常满足了要求,即使好不容易在部手机上满足了需求,放在另外手机上,发现效果差强人意。今天把自己这...
  • 近三年前的篇旧文,虽然在浏览器和相关技术标准方面有过时之处,但总体上对概念的理解、开发的思路和代码样例仍然有参考价值。背景当Javascript被Netscape公司发明出来时,它被用来做一些琐细的事情,比如校验表单...
  • gif格式图片修改后的问题

    千次阅读 2010-05-30 19:10:00
    本人会用Photoshop和flash,认为是小意思,可是出了系列问题: 1、ps提示“无法置入文档"ddf",因为找到不知名的或无效的JPEG标识符类型”我用Photoshop去掉文字,可当我加在gif格式的那张图片让我加载,弹...
  • 大家喜欢小程序的tabbar原因之就是它太死板,tabbar一旦在app.json定义以后文字不能改,图标能改! 我要自制tabbar!!!   其实在微信更新完1.9.0基础调试以后就推出了更新方案 ......
  •  不想再使用Win7了,因为感觉有了Win8 ,Win7就多余了,不过倒是想换成XP,虽然微软不再对XP进行维护了,但很多时候,C++还在用VC6.0,Win8不兼容,当然也找过解决方法,不过还是觉得XP靠谱一些,所以打算这样分配...
  • android开发 之 Canvas绘制文字图片

    万次阅读 2017-08-02 17:22:26
    .Canvas的常用操作速查表操作类型相关API备注绘制颜色drawColor, drawRGB, drawARGB使用单一颜色填充整个画布绘制基本形状drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, ...
  • 或者图片太小,文字太大,总之就是协调。我们的需求是让图片的大小跟着屏幕的变化而变化,就是动态的去适应屏幕;那么文字的字体就是我们自己可以控制,可大可小。要达到这样的效果,我们要在用loadHTMLString...
  • 为了统一回答大家的问题,今天我又使用百度API实现了个从图片中提取文字和识别身份证的功能,详细描述实现过程,有收获的小伙伴记得收藏、转发分享哦。 百度AI开放平台 百度AI开放平台网址:...
  • 图片文字转换成word软件在线版

    千次阅读 2017-02-20 16:04:22
    这显然不是个有效的方法,遇到图片格式的文件,不少朋友都图片上的文字识别为word文档,但是苦于不知该如何操作,其实要将图片转换成word格式很简单,在线就能完成。 首先我们打开浏览器,在百度中输入在线...
  • Android利用Gradle多渠道打包如何动态替换资源,文字动态替换logo首先我们在app的build.gradle下面加入如下代码,以oem1为示例,productFlavors { oem1 { manifestPlaceholders = [ oemIcon : "@drawable/oem1",
  • 有时候在个div中写了文字,当给div加上padding值时,文字不会居中的现象 解答: 由于div的宽度是border.width+margin.width+content.width 所以当单独增加padding的宽度,只会增大整个div的宽度 如果要控制...
  • 这个自定义的控件是个盖世英雄,它仅仅是个**Loading控件**,同时还支持**进度条 (ProgressBar)**功能 。它会在你需要的时候出现,它支持 **left**,**top**,**right**,**bottom** 四个方向加载(变色),...
  • 编辑喵先生跟我说他实现个想法,在微信公众号文章中实现个效果,点击图片,显示文字。问我可可以做到。 困难 微信公众号的编辑器无法嵌入css代码和js代码 微信公众号编辑器无法编辑html代码,只能放入纯...
  • 前言   OCR 是 Optical Character Recognition 的缩写,翻译为光学字符识别,指的是针对印刷体字符,采用...简单的来说,OCR技术就是可以把图片上的文字识别出来,并以文本格式的形式提取出来。   这个技术...
  • android 图片下面显示文字

    千次阅读 2013-03-21 09:27:44
    现在移动设备的按钮设计讲究大图标小文字,希望用户只要看到图标便能知道这个按钮是干嘛的,但又要有必要的文字提示,最常见的就数搜索按钮了,上面个大大的放大镜图标,下面两个字——搜索。 Bill最近也在做...
  • 至于为什么直接放一张带二维码的图片呢,这是公司业务需求,下面来说说怎么实现的(二维码后台返回的是一张正方形图片,后期经过处理成这样的) public class JointBitmapView extends View { private Bitmap ...
  • android的EditText里文字图片混合编辑与显示

    千次阅读 多人点赞 2018-02-23 19:33:57
    android的EditText其实很强大,它是可以显示部分Html格式的,而下面则介绍如何使用EditText进行文字图片的混合编写与显示。 首先放一张效果图(我插入的图片侵删): 插入图片我参考了这篇博客:使用Html在...
  • python Tesseract OCR 武乾坤番外篇
  • 个简单炫酷的app程序的打开动画

    万次阅读 多人点赞 2017-04-03 01:06:17
    该文章为视图动画初步教程,目标是带你步步实现个简单的app打开的界面欢迎动画
  • Itext7改版相对于Itext5改版很大,由于新出来...3、添加文字水印,水印显示在图片的上面。 程序运行效果如下: 1、引入maven依赖包 为了方便下面直接引入itext7全家桶,有兴趣可以直接研究单个包引入。 <...
  • 文字换行循环遍历 要实现图片的循环遍历, 1.在data中把图片的路径用数组组合而成。 比如 data(){ return { content_top:[ { title:‘图片1", src:’./imges/a.png’ key:‘0’}, { title:‘图片2", src:’./imges/...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 95,568
精华内容 38,227
关键字:

一动不想动的文字图片