首页 文章 精选 留言 我的

精选列表

搜索[网页制作],共10002篇文章
优秀的个人博客,低调大师

Android 怎么制作按钮点击的波纹?

在安卓的 Mixnum API Level 为5.0的项目里,设计一个按钮的背景色,但设置背景色后,发现它的点击的波纹动画效果没有了,于是搜索根据网上教程复制了一个,但不太懂怎么弄, 不过波纹效果到是实现了,但是效果不太好,表现是这样的,用户单击按钮。背景就是闪成透明一下。只有长按按钮才能稍微看到点波纹效果。怎么实现像系统自带的Button的点击动画的波纹效果一样? xml代码如下: 点击背景效果设置 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="false"> <shape > <!-- 背景色 --> <solid android:color="@color/colorPrimary"/> </shape> </item> <item android:drawable="@drawable/ripple_bg" android:state_pressed="true"> </item> </selector> 波纹效果ripple_bg文件内容 <ripple xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:color="@color/colorPrimary" tools:targetApi="lollipop"> <item android:id="@android:id/mask"> <shape android:shape="rectangle"> <solid android:color="@color/colorPrimary" /> </shape> </item> </ripple>

优秀的个人博客,低调大师

自己制作的RocketMQ的Docker镜像

由RocketMQ官方包打包,版本为rocketmq:4.3.1(压缩包下载地址) 单机 broker-a-m: image: registry.cn-hangzhou.aliyuncs.com/leonardo/rocketmq-broker:4.3.1 container_name: broker-a-m hostname: broker-a-m restart: always ports: - "10909:10909" networks: - "leonardo" depends_on: - "namesrv" volumes: - "/usr/local/docker/rockermq/logs/broker/a-m:/opt/logs" - "/usr/local/docker/rockermq/store/broker/a-m:/opt/store" - "/usr/local/docker/rockermq/data/broker/a-m:/opt/data" - "/usr/local/docker/rockermq/config/broker/a-m:/opt/conf" - "/etc/localtime:/etc/localtime" 集群 broker-a-m: image: registry.cn-hangzhou.aliyuncs.com/leonardo/rocketmq-broker:4.3.1 container_name: broker-a-m hostname: broker-a-m restart: always ports: - "10909:10909" networks: - "leonardo" depends_on: - "namesrv" volumes: - "/usr/local/docker/rockermq/logs/broker/a-m:/opt/logs" - "/usr/local/docker/rockermq/store/broker/a-m:/opt/store" - "/usr/local/docker/rockermq/data/broker/a-m:/opt/data" - "/usr/local/docker/rockermq/config/broker/a-m:/opt/conf" - "/etc/localtime:/etc/localtime" broker-a-s: image: registry.cn-hangzhou.aliyuncs.com/leonardo/rocketmq-broker:4.3.1 container_name: broker-a-s hostname: broker-a-s networks: - "leonardo" depends_on: - "namesrv" restart: always ports: - "10911:10911" volumes: - "/usr/local/docker/rockermq/logs/broker/a-m:/opt/logs" - "/usr/local/docker/rockermq/store/broker/a-m:/opt/store" - "/usr/local/docker/rockermq/data/broker/a-m:/opt/data" - "/usr/local/docker/rockermq/config/broker/a-s:/opt/conf" - "/etc/localtime:/etc/localtime" 配置文件说明broker.properties 1.a-m # 所属集群名字 brokerClusterName=leonardo-rocketmq-cluster # broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a # nameServer 地址,分号分割 namesrvAddr=namesrv:9876 # 0 表示Master(主), > 0 表示slave(从) brokerId=0 # Broker 对外服务的监听端口 listenPort=10909 #多网卡机器配置IP地址 brokerIP1=192.168.56.103 # 删除文件时间点,默认是凌晨4点 deleteWhen=04 # 文件保留时间,默认48小时 fileReservedTime=72 #角色 brokerRole=ASYNC_MASTER #存储路径 storePathRootDir=/opt/store #commitLog存储路径 storePathCommitLog=/opt/store/commitlog # 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数 defaultTopicQueueNums=4 # 是否允许Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=true # 是否允许Broker自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=true # 刷盘方式 # - ASYNC_FLUSH 异步刷盘 # - SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH 2.a-s # 所属集群名字 brokerClusterName=leonardo-rocketmq-cluster # broker名字,注意此处不同的配置文件填写的不一样 brokerName=broker-a # nameServer 地址,分号分割 namesrvAddr=namesrv:9876 # 0 表示Master(主), > 0 表示slave(从) brokerId=1 # Broker 对外服务的监听端口 listenPort=10911 #多网卡机器配置IP地址 brokerIP1=192.168.56.103 # 删除文件时间点,默认是凌晨4点 deleteWhen=04 # 文件保留时间,默认48小时 fileReservedTime=72 #角色 brokerRole=SLAVE #存储路径 storePathRootDir=/opt/store #commitLog存储路径 storePathCommitLog=/opt/store/commitlog # 在发送消息时,自动创建服务器不存在的Topic,默认创建的队列数 defaultTopicQueueNums=4 # 是否允许Broker 自动创建Topic,建议线下开启,线上关闭 autoCreateTopicEnable=false # 是否允许Broker自动创建订阅组,建议线下开启,线上关闭 autoCreateSubscriptionGroup=false # 刷盘方式 # - ASYNC_FLUSH 异步刷盘 # - SYNC_FLUSH 同步刷盘 flushDiskType=ASYNC_FLUSH

优秀的个人博客,低调大师

python自动制作gif并添加文字

引言 最近租的房子快到期了,哎,因为去年是第一次找房子租,结果遇到了一个东北黑中介,押一付三,房子有啥问题,灯坏了,下水道堵了,原来签合同的时候说的客气,说是马上就会上门解决,结果实际上我每次找他,都是各种推脱,最后不了了之。全部是我自己想办法解决的。现在又打电话催着我要搬走,押金也不打算退给我了。真的是rlgl。我反对地域黑,但是以后东北的中介一生黑。(再次声明,不是地域黑,我也有认识的人很好的东北的朋友。)今天我又看到了有钱可以为所欲为的经典gif,所以我心血来潮想做一个自己的东北黑中介版的为所欲为gif。本来我想找一个没有文字的gif,然后找一个软件添加文字,然后合成gif的。结果在网上搜索了一下,没有找到合适的原版gif,只找到了一个有文字的gif。到是有软件可以手动添加文字合成gif的,但是如果要首先把原来的文字去除,然后再一点点添加,手动要做大量的工作,很是麻烦。我再尝试了半个小时还没弄好就放弃了(但是我想应该有比较简便的方法,只是我懒得再自己去找了)。最后我想既然作为一个程序员,能不能通过代码去实现这个功能呢?当然可以啦。我最熟悉的是python,自然优先考虑上python了。之前接触过PIL这个库,我记得它有给图片添加文字的功能,而且最近不是才刚刚看了moviepy这个库,它可以很容易合成gif,把这两个结合到一起不就很容易实现我想要的目标了吗?一不做二不休,开搞! 1. 处理gif以及基本思路 我找到的原始的gif如下图1所示: 图1 原始"为所欲为"gif(来自微博) 如果你的电脑已经安装了ffmpeg的话,那么将gif分割成单帧的序列图片是非常容易的,运行下面的命令: ffmpeg -i 为所欲为.gif %d.jpg 就可以将为所欲为.gif分割成1.jpg,2.jpg,...。当然你也可以直接使用python的PIL库来处理gif,使用如下的代码即可: from PIL import Image,ImageSequence gif = Image.open("为所欲为.gif") for i,frame in enumerate(ImageSequence.Iterator(gif),1): frame.save("%d.jpg" % i) 或者你也可以使用之前介绍过的moviepy库(具体可以参考我之前的一篇博客),如果你对opencv比较熟悉的话,自然也可以使用opencv来处理。这里就不详细说了。 得到gif的帧序列图像之后,简单来说一下后面处理的思路。因为原来的gif有些帧是有文字的,我们要想添加自己的文字,就必须要把原来的文字去除掉,然后换成自己的。所以后面基本的思路就是: 找出那些有文字出现的帧,把文字去除; 原来的文字去除之后,替换成自己的合适的文字,形成新的帧图像; 将新的帧图像合成为新的gif(这里使用moviepy合成)。 2. 实现代码以及简要解析 具体实现代码如下: # -*- coding:utf-8 -*- import matplotlib.pyplot as plt from PIL import Image,ImageDraw,ImageFont from scipy.misc import imread,imsave,imresize import numpy as np import os from glob import glob from moviepy.editor import ImageSequenceClip # 消除文字的图片序号 modify_img_index = list(range(11,14))+list(range(27,37)) + list(range(44,61)) + list(range(62,81)) \ + list(range(82,94)) + list(range(97,106)) + list(range(112,132)) + list(range(146,168)) text_info = [('好啊',(120,140))]*(14-11) + \ [('就算你今天找人来抗议',(40,140))]*(37-27) + \ [('就算你的理由再完美',(50,140))] *(61-44) + \ [('我想不退钱就不退钱',(50,140))] *(81-62) + \ [('毕竟我是东北黑中介',(50,140))] *(94-82) + \ [('东北黑中介了不起啊',(50,140))] *(106-97) + \ [('sorry,东北黑中介真的可以为所欲为',(5,140))]*(132-112) + \ [('以后让他天天闹',(60,140))]*(158-146) + \ [('天天闹',(110,140))]*(169-158) index_to_text = dict(zip(modify_img_index,text_info)) # 保存图片文件夹 save_dir = "output" if not os.path.exists(save_dir): os.mkdir(save_dir) new_color = np.array([50,50,50]) # 消除文字之后的颜色 fontsize = 18 fontcolor = (0,255,255) fps = 10 resize_scale = 1.5 # 新图的宽和高是原来的多少倍 # 消除文字的x,y边界坐标 y_begin = 10 y_end = 280 x_begin = 140 x_end = 160 # 全部文件列表(无序) img_names = glob("*.jpg") #print(img_names) def modify(): # 遍历每一个图像 for img_name in img_names: img = imread(img_name) h,w = img.shape[0],img.shape[1] #plt.imshow(img) img_new = np.copy(img) index = int(img_name.split(".")[0]) # 如果图片有文字,需要修改 if index in modify_img_index: # 消除文字 img_new[x_begin:x_end,y_begin:y_end] = new_color text,pos = index_to_text[index] img_new = drawtext(Image.fromarray(img_new),text,pos,fontsize,fontcolor) #保存新的图片 # imsave(os.path.join(save_dir,img_name),img_new) if resize_scale != 1: # resize img_new = img_new.resize((int(w*resize_scale),int(h*resize_scale))) img_new.save(os.path.join(save_dir,img_name)) print("Modify and save %s!" % img_name) else: # 没有文字,不需要修改,直接保存原来的图片 if resize_scale != 1: img = imresize(img,resize_scale) imsave(os.path.join(save_dir,img_name),img) print("Save %s!" % img_name) def drawtext(img,text,pos,fontsize,fontcolor): ''' draw text for img @param img:image to draw text @param text:text to draw @param pos:where to draw the text((x,y)) @param fontsize: font size @param fontcolor: font color ''' font = ImageFont.truetype("simsun.ttc",fontsize) draw = ImageDraw.Draw(img) draw.text(pos,text,fontcolor,font = font) # plt.imshow(img) # plt.show() return img def test_drawtext(): img_name = "4.jpg" img = Image.open(img_name) #text = "好啊" text = "东北黑中介了不起啊" pos = (40,140) fontsize = 20 fontcolor = (0,255,255) drawtext(img,text,pos,fontsize,fontcolor) # 利用图像序列生成gif def generate_gif(img_names,save_path,fps = 10): # img_names:list of image names clip = ImageSequenceClip(img_names,fps = fps) clip.write_gif(save_path) print("Write %s successfully!" % save_path) # 主函数 def main(): modify() save_gif_path = os.path.join(save_dir,"东北黑中介.gif") img_names = sorted(glob(os.path.join(save_dir,"*.jpg")),key = lambda x: int(x.split(".")[0].split("/")[1])) generate_gif(img_names,save_gif_path,fps) #test_drawtext() if __name__ == '__main__': main() 上面的代码思路其实还是比较清楚的。主要麻烦的地方就在于,我们没法自动确认哪些帧出现了文字,所以在这里我采用手动观察图像(有167张图)的方式,确定了出现文字的帧序列区间;然后对于这些帧序列区间,其文字替换成我自己的文字。还有一个问题就是,我要消除文字,就要知道文字的位置,其实这个可以归结为一个目标检测的问题,或者说是一个OCR问题(OCR的第一步,定位文字),但是OCR做起来还是很麻烦的,这里暂时不说,后面有空我会专门讨论OCR问题。这里比较好的地方在于,所有的文字出现的高度位置几乎是一样的,只是宽度方向的位置不一样(有的字多,有的字少),这里我还是采用手动观察标注的办法,可以借助于matplotlib显示图像,用鼠标点击图像的某一点,它会显示该点的(x,y)坐标和像素值,这样我们就可以手动确定要消除的文字的位置,以及消除文字要填充的颜色了。按照这个思路,我们可以得到一些消除原来文字,添加新文字之后的图像如下图2所示: 图2 原始帧和消除文字后添加新文字的帧(上是原始帧,下是处理之后的新帧) 最终合成的新的gif如下图3所示: 图3 最终合成的gif 3. 小结 本文主要利用python的PIL库(用于处理图像,添加文字等)和moviepy(用于生成gif)自动生成了gif并添加了文字。但是还有一些问题,比如文字自动定位并识别没有解决。这些问题留到后面介绍OCR技术的时候再和大家介绍。如果只是简单地尝试合成gif,大家不妨自己动手试一试。 全文完,感谢阅读! 热爱编程,热爱机器学习! github:http://www.github.com/Lyrichu github blog:http://Lyrichu.github.io 个人博客站点:http://www.movieb2b.com(不再维护)

优秀的个人博客,低调大师

docker 制作最小化Java镜像

前提:目前大部分的java images都是根据centos和Ubuntu做的,结果是镜像非常大,基本上300-500m,太影响docker的使用了。 思路:换更加轻量级的linux系统,删除jdk中无关的东西 先下载jdk的tar包,然后删除jdk中无关的东西 将jdk1.6.0_33.tgz 解压到 /usr/java/jdk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 rm-rf/usr/java/jdk/*src.zip\ /usr/java/jdk/lib/missioncontrol\ /usr/java/jdk/lib/visualvm\ /usr/java/jdk/lib/*javafx*\ /usr/java/jdk/jre/lib/plugin.jar\ /usr/java/jdk/jre/lib/ext/jfxrt.jar\ /usr/java/jdk/jre/bin/javaws\ /usr/java/jdk/jre/lib/javaws.jar\ /usr/java/jdk/jre/lib/desktop\ /usr/java/jdk/jre/plugin\ /usr/java/jdk/jre/lib/deploy*\ /usr/java/jdk/jre/lib/*javafx*\ /usr/java/jdk/jre/lib/*jfx*\ /usr/java/jdk/jre/lib/amd64/libdecora_sse.so\ /usr/java/jdk/jre/lib/amd64/libprism_*.so\ /usr/java/jdk/jre/lib/amd64/libfxplugins.so\ /usr/java/jdk/jre/lib/amd64/libglass.so\ /usr/java/jdk/jre/lib/amd64/libgstreamer-lite.so\ /usr/java/jdk/jre/lib/amd64/libjavafx*.so\ /usr/java/jdk/jre/lib/amd64/libjfx*.so 以下dockerfile 基于AlpineLinux 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #AlpineLinuxwithaglibc-2.21andOracleJava7 FROMdocker.io /jeanblanchard/alpine-glibc #MAINTAINERFoxChan #JavaVersion #ENVJAVA_VERSION_MAJOR7 #ENVJAVA_VERSION_MINOR60 #ENVJAVA_PACKAGEjdk #installjava ADDjdk /usr/java/jdk #Setenvironment ENVJAVA_HOME /usr/java/jdk ENVPATH${PATH}:${JAVA_HOME} /bin 才158.3 MB,太酷了! 本文转自银狐博客51CTO博客,原文链接http://blog.51cto.com/foxhound/1725221如需转载请自行联系原作者 战狐

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册