首页 文章 精选 留言 我的

精选列表

搜索[智能推荐],共10009篇文章
优秀的个人博客,低调大师

推荐一款优雅的日历控件

原文链接:https://mp.weixin.qq.com/s/SmxDiWIidHS2hwVvFcz_hw 项目需要用到日历控件,这是我们的效果图。 去github上搜了一哈,搜到大神写的CalendarView,各种炫酷效果,我这种的也只需要自定义效果就可以了,话不多说,直接开撸! 这里附上github的链接地址:https://github.com/huanghaibin-dev/CalendarView, 里面的api文档说明还是很齐全的,这里就直接记录我的开发历程。 gradle 关联 implementation 'com.haibin:calendarview:3.4.0' 使用 刚开始布局中使用的话注意是 <com.haibin.calendarview.CalendarView /> 有包名路径的,如果直接是 <CalendarView /> 使用的是系统自带的日历控件。 <com.haibin.calendarview.CalendarView android:layout_width="match_parent" android:layout_height="wrap_content" /> 可以直接预览效果,一些属性配置项: app:month_view_show_mode="mode_fix" 配置月视图的显示模式 app:current_month_text_color="#212121" 当前页月份的月字体颜色 app:other_month_text_color="#cccccc" 当前页其余月份的月字体颜色 等等一系列的属性配置,文档里都是有的。当然要实现自己的效果,那些属性是不够的,需要我们自定义MonthView 去实现(项目地址里也有demo可下载参考)。 自定义 MonthView 自定义MyMonthView 类继承自 MonthView,xml布局里添加属性 app:month_view="com.calendar.MyMonthView",这里的路径是自己实际项目中的monthView的路径,需要我们自己去绘制日历。 //取消日历字体加粗 mCurMonthTextPaint.setFakeBoldText(false); mOtherMonthTextPaint.setFakeBoldText(false); 这里插个题外的知识点tip: setFakeBoldText(true) 的加粗效果比 android:textStyle="bold" 属性的加粗效果要弱点,就是不会太粗,又比细稍微粗一点的效果~ 了解一下 在onDrawText里进行绘制,正常样式的日历可正常显示时间的 @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { float baselineY = mTextBaseLine + y; int cx = x + mItemWidth / 2; int cy = y + mItemHeight / 2; canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); } 这里要分类下我们需要几种类型的样式: 1、不可完成的 2、可以完成的 3、今日已完成的 4、历史已完成的 模拟数据,通过scheme 标记区分各样式 Calendar calendar1 = getSchemeCalendar(2018, 8, 11, "1"); Calendar calendar2 = getSchemeCalendar(2018, 8, 12, "2"); Calendar calendar3 = getSchemeCalendar(2018, 8, 13, "3"); Calendar calendar4 = getSchemeCalendar(2018, 8, 6, "4"); map.put(calendar1.toString(), calendar1); map.put(calendar2.toString(), calendar2); map.put(calendar3.toString(), calendar3); map.put(calendar4.toString(), calendar4); calendarView.setSchemeDate(map); private Calendar getSchemeCalendar(int year, int month, int day, String text) { Calendar calendar = new Calendar(); calendar.setYear(year); calendar.setMonth(month); calendar.setDay(day); calendar.setScheme(text); return calendar; } 初始化两个paint,有两张图片资源的用Bitmap去绘制 paint1.setColor(ContextCompat.getColor(context, R.color.green)); paint1.setTextSize(DensityUtil.spToPx(context, 13)); paint1.setStyle(Paint.Style.STROKE); paint1.setAntiAlias(true); paint1.setTextAlign(Paint.Align.CENTER); paint2.setColor(ContextCompat.getColor(context, R.color.white)); paint2.setTextSize(DensityUtil.spToPx(context, 13)); paint2.setAntiAlias(true); paint2.setTextAlign(Paint.Align.CENTER); dayBgBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.day_bg); daySuccessBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.day_success); 主要的方法 onDrawText ,根据不同scheme 绘制各view @Override protected void onDrawText(Canvas canvas, Calendar calendar, int x, int y, boolean hasScheme, boolean isSelected) { //这里的x、y 是每日的起点坐标 float baselineY = mTextBaseLine + y; int cx = x + mItemWidth / 2; int cy = y + mItemHeight / 2; if ("1".equals(calendar.getScheme())) { // 不可完成的,绘制圆 paint1.setStrokeWidth(0); canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, paint1); paint1.setStrokeWidth(DensityUtil.dpToPx(context, 1)); canvas.drawCircle(cx, cy + 3, mItemWidth / 4 - 9, paint1); } else if ("2".equals(calendar.getScheme())) { //可以完成的,绘制背景图 canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, paint2); canvas.drawBitmap(dayBgBitmap, x + mItemWidth / 4 - 5, y + mItemHeight / 4 + 8, paint2); } else if ("3".equals(calendar.getScheme())) { //今日已完成的,绘制圆+打勾图片 paint1.setStrokeWidth(0); canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, paint1); paint1.setStrokeWidth(DensityUtil.dpToPx(context, 1)); canvas.drawCircle(cx, cy + 3, mItemWidth / 4 - 9, paint1); canvas.drawBitmap(daySuccessBitmap, x + mItemWidth * 3 / 4 - 18, y + mItemHeight * 3 / 4 - 24, paint1); } else if ("4".equals(calendar.getScheme())) { //历史已完成的,绘制打勾图片 paint1.setStrokeWidth(0); canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, paint1); canvas.drawBitmap(daySuccessBitmap, x + mItemWidth * 3 / 4 - 18, y + mItemHeight * 3 / 4 - 40, paint1); } else { //正常日期的显示 canvas.drawText(String.valueOf(calendar.getDay()), cx, baselineY, calendar.isCurrentMonth() ? mCurMonthTextPaint : mOtherMonthTextPaint); } } 至此,视图绘制完成。 接下来完成基本的api调用。 api 调用 初始化赋值当前的年月,日历切换时,时间对应改变。 //初始化当前年月 tvMonth.setText(calendarView.getCurYear() + "年" + calendarView.getCurMonth() + "月"); //月份切换改变事件 calendarView.setOnMonthChangeListener(new CalendarView.OnMonthChangeListener() { @Override public void onMonthChange(int year, int month) { tvMonth.setText(year + "年" + month + "月"); } }); 布局里有个时间选择器,用于选择年月的,这里采用的是 Android-PickerView 时间选择器。 //时间选择器选择年月,对应的日历切换到指定日期 picker.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TimePickerView pvTime = new TimePickerBuilder(MainActivity.this, new OnTimeSelectListener() { @Override public void onTimeSelect(Date date, View v) { java.util.Calendar c = java.util.Calendar.getInstance(); c.setTime(date); int year = c.get(java.util.Calendar.YEAR); int month = c.get(java.util.Calendar.MONTH); //滚动到指定日期 calendarView.scrollToCalendar(year, month + 1, 1); } }).setType(type).build(); pvTime.show(); } }); 日期的选择监听事件 calendarView.setOnDateSelectedListener(new CalendarView.OnDateSelectedListener() { @Override public void onDateSelected(Calendar calendar, boolean isClick) { } }); 效果完成图,当然不同项目里的效果图是不一样的,只要会canvas的基本绘制都是可以达到各自想要的效果的。 详细代码见 github地址:https://github.com/taixiang/calendar 欢迎关注我的博客:https://blog.manjiexiang.cn/ 更多精彩欢迎关注微信号:春风十里不如认识你 有个「佛系码农圈」,欢迎大家加入畅聊,开心就好! 过期了,可加我微信 tx467220125 拉你入群。

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

推荐一款团队协作软件---confluence

最近发现一款非常好的团队协作软件--confluence,它可以做技术博客,发送文章,下面评论,点赞.也可以作为公司内部的团队协作软件,在线编辑word,execel,ppt等。这个功能与腾讯的在线编辑word,execel类似。但是它的功能更强大。 环境准备 ◦CentOS 6.5 ◦java jdk 1.8 ◦mysql-server 5.6 ◦confluence 5.6.6 当然也有windows版本(可以自己玩),企业的话最好还是放在服务器当中稳定 下载confiluence及其破解包 confluence有很多版本,我们可以直接通过如下连接进行查看confluence下载地址 image.png 通过上图,我们可以看出confluence对于windows和linux平台每一个版本有多种安装包, 在此我们选择的是bin方式。除此之外,我们也可以看到目前confluence最新版本是6.0.1。 下载confluence5.6.6 curl -o atlassian-confluence-5.6.6-x64.binconfluence破解包 创建数据库 在安装confluence之前,我已经安装好了mysql5.6的数据库,并且创建了数据库和用户,语句如下 mysql> CREATE DATABASE confluence CHARACTER SET utf8 COLLATE utf8_bin; mysql> GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'localhost' IDENTIFIED BY '123.com'; mysql> GRANT ALL PRIVILEGES ON confluence.* TO 'confluence'@'10.16.10.44' IDENTIFIED BY '123.com'; mysql> FLUSH PRIVILEGES; 安装confluence chmod +x atlassian-confluence-5.6.6-x64.bin ./atlassian-confluence-5.6.6-x64.bin image 通过上图,我们可以很明显的看出confluence安装到了/opt/atlassian/confluence和/var/atlassian/application-data/confluence目录下,并且confluence监听的端口是8090 下面访问地址 192.168.4.38:8090 image.png 破解confluence 关闭confluence service confluence stop 删除jar文件 cd /opt/atlassian/confluence/confluence/WEB-INF/lib/ ll | grep atlassian-extras | wc -l 6 rm -fr atlassian-extra* 解压破解包,把里面的atlassian-extras-3.2.jar、Confluence-5.6.6-language-pack-zh_CN.jar、mysql-connector-java-5.1.39-bin.jar三个jar文件复制到/opt/atlassian/confluence/confluence/WEB-INF/lib目录下 cd /work/confluence5.6.6-crack/jar/ cp ./* /opt/atlassian/confluence/confluence/WEB-INF/lib/ service confluence start # 并启动服务 其中atlassian-extras-3.2.jar文件是和license相关的,Confluence-5.6.6-language-pack-zh_CN.jar是confluence中文语言包,而mysql-connector-java-5.1.39-bin.jar是confluence连接mysql数据库相关的jar包。 运行破解jar包 java -jar confluence_keygen.jar 把上述复制的Server ID粘贴进去,然后点击 gen image 开始安装confluence image image image image image image image 相关资源路径: 利用Confluence搭建企业Wiki Windows下安装Confluence并破解汉化 刚开始用,后续再更新.感觉可以做自己的个人博客非常适合,也可以点赞查看,作为团队协作工具也是非常好的一个软件。

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

推荐Python数据框Pandas视频教程

若要独立用 Python 处理数据科学问题,Pandas 是绕不过去的。 新番 今天,花了一上午的时间,跟着这个 Youtube 系列教程,学习了 Pandas 中级技巧。 视频来自于 Data School。发布者是 Kevin Markham 。 在这个系列视频教程里, Kevin 将自己的 PYCON 2018 workshop 分成了10个部分全部精剪后释出。一步步带你领略 Pandas 的魅力。 我用了2个多小时,完成了他10个视频的全部内容。 收获颇丰。 利用教程中提到的美国交通警务数据来自于斯坦福开放警务项目(THE STANFORD OPEN POLICING PROJECT)。 这是数据大概的样子: 一步步按照 Kevin 的指令练习,你可以完成这些内容: 分析男女司机的交通违规都包括哪些类别?每一类占比如何? 那些被搜查车辆的男女司机,各是由于什么原因? 哪个时段,警察发现违规的数量最多? 不同违规行为里,司机年龄是如何分布的? 这些分析结果,只是这个教程的一小部分而已。 更妙的是,上述这些图形,几乎都是利用两三条 Pandas 语句,就可以做出。有的只需要一条就可以。 怎么样?有没有想学习的冲动? 教程与 ipynb 文件,都可以从这个github repo下载。 安装好 Anaconda 3之后,你就可以打开一个 Jupyter Notebook,跟着视频一起做了。 老友 说说我是怎么找到这么好的视频教程的。 其实一点儿也不稀奇。

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

OpenCV相关网站推荐(Informative websites related to OpenCV)

原文来自: http://answers.opencv.org/question/69691/informative-websites-related-to-opencv/ i think it will be useful if we add links of informative websites related to OpenCV here. Lets create a list together. 计划花费1个星期左右时间,将其中标红的而且能够开打的网站进行初步研究,写出调查结果。 C ++ http://codecapsule.com/category/compu... OpenCV simplified for beginners by the use of examples http://www.learnopencv.com/ http://web.archive.org/web/2015031423... MoreThanTechnical notes on different topics of computer vision by Jürgen Brauer http://www.bogotobogo.com http://www.shervinemami.info/openCV.html https://github.com/MasteringOpenCV/code Some good patterns to be followed in C++ API https://gilscvblog.wordpress.com/ http://harismoonamkunnu.blogspot.in/ http://study.marearts.com/p/contents-... http://www.jayrambhia.com http://computer-vision-talks.com/tags... http://aishack.in/tutorials/ http://eric-yuan.me/ http://ramsrigoutham.com/ http://www.nithinrajs.in/category/ima... http://nghiaho.com/ (Where boredom, free time, and curiosity meet together) Using OpenCV's Test Framework (With CMake) http://opencv-srf.blogspot.com.tr/p/o... http://bytefish.de/tag/opencv/ http://felix.abecassis.me/category/op... PYTHON Nullege is a search engine for Python source code. Abid Rahman K's blog , maybe same content at opencv-python-tutroals http://www.pyimagesearch.com/ http://www.got-blogger.com/opencvpython/ http://opencvpython.blogspot.dk/ http://hanzratech.in/categories/opencv/ http://scikit-learn.org/stable/auto_e... JAVA http://opencv-java-tutorials.readthed... https://github.com/atduskgreg/opencv-... ANDROID https://github.com/DeLaSalleUniversit... YOUTUBE https://www.youtube.com/channel/UClOg... : A complete course of Computer Vision. COMPUTER VISION http://www.computervisionblog.com Awesome Computer Vision Andrej Karpathy Reproducible Research in Computational Science https://msopentech.com/blog/tag/opencv/ http://vision.ucsd.edu/~pdollar/resea... http://arxiv.org/list/cs.CV/recent https://github.com/kjw0612/awesome-de... ( thank to @berak) https://www.reddit.com/r/computervision/ http://web.media.mit.edu/~roys/ http://www.cs.berkeley.edu/~rbg/ http://www.haralick.org/ http://davidstutz.de/tag/computer-vis... VLFeat -- Vision Lab Features Library cvlibs.net Other Related & Non-English Resources http://opencv.jp/ http://acodigo.blogspot.com.es/p/tuto... http://www.aprendiendoando.com/opencv http://turing.iimas.unam.mx/~ivanvlad... http://visionlabs.cl/blog/?cat=5 http://disparity.wikidot.com/ http://www.tutorialspoint.com/compute... http://hanzratech.in/categories/opencv/ https://github.com/isocpp/CppCoreGuid... http://rodrigob.github.io/ http://www.codeproject.com/search.asp... Open Source Landmarking Library Learning, Recognition, and Surveillance Something More for Research - Hemprasad Badgujar Academic Web Pages Computer Vision Group at RWTH Aachen University IPOL Journal · Image Processing On Line-Very useful journal with access to sourcecode & paper. Berkeley University Computer Vision page University of Central Florida Computer Vision Foundation open access Computer Vision Group Middlebury Stereo Vision - Stereo Based Larry S. Davis William Robson Schwartz Zhang Ming's github repo contains academic papers about Computer Vision http://www.cvpapers.com/ Active Vision Laboratory - University of Oxford Torr Vision Group Philipp Krähenbühl James Hays DATABASE Center for Machine Learning and Intelligent Systems Unfiltered faces for gender and age classification Motion and Change Detection - Video Database The Stanford Mobile Visual Search Dataset ... 实现了非常棒的人脸变化的结果,但是不开源。相关资料(他引用的技术)值得进一步研究 同时,他提到使用了grabcut实现这样的效果。我们下一步将在android平台上实现这些技术。 这个网站就是比较杂了,属于专门做教程的网站,应该说我也是从它上面获得了很多教益。和所有做这个方面工作的人一样,大家都将未来的主要方向转向了大数据、机器识别这个方面。 《Mastering OpenCV with Practical Computer Vision Projects》这本书里面是有相关资料的,如果下一步做人脸识别是应该来做相关参考的。 之前看过它的相关资料,应该说很久不更新了。 Some C++ good practices from the OpenCV source code 这篇文章是非常少见的分析OpenCV自己代码的文章,非常有价值。 只有一些比较旧的资料了,而且我一直不觉得使用高级语言来写OpenCV程序是一个好主意。 基于人脸实现了emotion、age、gender,应该说还是很实用,之前做了比较多的特征点方面的研究。 之前好像介绍过,这里实现的这个CloudCV也是下一步需要继续研究的东西,当然可能还有其它的实现方法。 非常值得注意的是,这个网站提供了很不错的学习资料。 最后,这几个例子的价值是非常高的。 这个网站之前也是学习过的,应该说是比较注重理论的。 这个网站中实现了比较完整的barcode的例子,应该说是做了比较系统的基础工作的。 提供了一些比较老的文章,但是他提供的东西基本是OpenCV官方认可的了。 这个网站光是提供的这个例子就值得好好研究。 来自为知笔记(Wiz) 目前方向:图像拼接融合、图像识别 联系方式:jsxyhelu@foxmail.com

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

Google推荐的图片加载库Glide介绍

http://blog.csdn.net/jianghejie123/article/details/44725649 英文原文Introduction to Glide, Image Loader Library for Android, recommended by Google 译文首发http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0327/2650.html 在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫Glide的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。 它的成功让我非常感兴趣。我花了一整晚的时间把玩,决定分享一些自己的经验。在开始之前我想说,Glide和Picasso有90%的相似度,准确的说,就是Picasso的克隆版本。但是在细节上还是有不少区别的。 导入库 Picasso和Glide都在jcenter上。在项目中添加依赖非常简单: Picasso [js] view plain copy dependencies{ compile'com.squareup.picasso:picasso:2.5.1' } Glide [js] view plain copy dependencies{ compile'com.github.bumptech.glide:glide:3.5.2' compile'com.android.support:support-v4:22.0.0' } Glide需要依赖Support Library v4,别忘了。其实Support Library v4已经是应用程序的标配了,这不是什么问题。 基础 就如我所说的Glide和Picasso非常相似,Glide加载图片的方法和Picasso如出一辙。 Picasso [js] view plain copy Picasso.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg); Glide [js] view plain copy Glide.with(context) .load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg") .into(ivImg); 虽然两者看起来一样,但是Glide更易用,因为Glide的with方法不光接受Context,还接受Activity 和 Fragment,Context会自动的从他们获取。 同时将Activity/Fragment作为with()参数的好处是:图片加载会和Activity/Fragment的生命周期保持一致,比如Paused状态在暂停加载,在Resumed的时候又自动重新加载。所以我建议传参的时候传递Activity 和 Fragment给Glide,而不是Context。 默认Bitmap格式是RGB_565 下面是加载图片时和Picasso的比较(1920x1080 像素的图片加载到768x432的ImageView中) 可以看到Glide加载的图片质量要差于Picasso(ps:我看不出来哈),为什么?这是因为Glide默认的Bitmap格式是RGB_565,比ARGB_8888格式的内存开销要小一半。下面是Picasso在ARGB8888下与Glide在RGB565下的内存开销图(应用自身占用了8m,因此以8为基准线比较): 如果你对默认的RGB_565效果还比较满意,可以不做任何事,但是如果你觉得难以接受,可以创建一个新的GlideModule将Bitmap格式转换到ARGB_8888: [js] view plain copy publicclassGlideConfigurationimplementsGlideModule{ @Override publicvoidapplyOptions(Contextcontext,GlideBuilderbuilder){ //Applyoptionstothebuilderhere. builder.setDecodeFormat(DecodeFormat.PREFER_ARGB_8888); } @Override publicvoidregisterComponents(Contextcontext,Glideglide){ //registerModelLoadershere. } } 同时在AndroidManifest.xml中将GlideModule定义为meta-data [js] view plain copy <meta-dataandroid:name="com.inthecheesefactory.lab.glidepicasso.GlideConfiguration" android:value="GlideModule"/> 这样看起来就会好很多。 我们再来看看内存开销图,这次貌似Glide花费了两倍于上次的内存,但是Picasso的内存开销仍然远大于Glide。 原因在于Picasso是加载了全尺寸的图片到内存,然后让GPU来实时重绘大小。而Glide加载的大小和ImageView的大小是一致的,因此更小。当然,Picasso也可以指定加载的图片大小的: [js] view plain copy Picasso.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .resize(768,432) .into(ivImgPicasso); 但是问题在于你需要主动计算ImageView的大小,或者说你的ImageView大小是具体的值(而不是wrap_content),你也可以这样: [js] view plain copy Picasso.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .fit() .centerCrop() .into(ivImgPicasso); 现在Picasso的内存开销就和Glide差不多了。 虽然内存开销差距不到,但是在这个问题上Glide完胜Picasso。因为Glide可以自动计算出任意情况下的ImageView大小。 Image质量的细节 这是将ImageView还原到真实大小时的比较。 你可以看到,Glide加载的图片没有Picasso那么平滑,我还没有找到一个可以直观改变图片大小调整算法的方法。 但是这并不算什么坏事,因为很难察觉。 磁盘缓存 Picasso和Glide在磁盘缓存策略上有很大的不同。Picasso缓存的是全尺寸的,而Glide缓存的是跟ImageView尺寸相同的。 上面提到的平滑度的问题依然存在,而且如果加载的是RGB565图片,那么缓存中的图片也是RGB565。 我尝试将ImageView调整成不同大小,但不管大小如何Picasso只缓存一个全尺寸的。Glide则不同,它会为每种大小的ImageView缓存一次。尽管一张图片已经缓存了一次,但是假如你要在另外一个地方再次以不同尺寸显示,需要重新下载,调整成新尺寸的大小,然后将这个尺寸的也缓存起来。 具体说来就是:假如在第一个页面有一个200x200的ImageView,在第二个页面有一个100x100的ImageView,这两个ImageView本来是要显示同一张图片,却需要下载两次。 不过,你可以改变这种行为,让Glide既缓存全尺寸又缓存其他尺寸: [js] view plain copy Glide.with(this) .load("http://nuuneoi.com/uploads/source/playstore/cover.jpg") .diskCacheStrategy(DiskCacheStrategy.ALL) .into(ivImgGlide); 下次在任何ImageView中加载图片的时候,全尺寸的图片将从缓存中取出,重新调整大小,然后缓存。 Glide的这种方式优点是加载显示非常快。而Picasso的方式则因为需要在显示之前重新调整大小而导致一些延迟,即便你添加了这段代码来让其立即显示: [js] view plain copy //Picasso .noFade(); Picasso和Glide各有所长,你根据自己的需求选择合适的。 对我而言,我更喜欢Glide,因为它远比Picasso快,虽然需要更大的空间来缓存。 特性 你可以做到几乎和Picasso一样多的事情,代码也几乎一样。 Image Resizing [js] view plain copy //Picasso .resize(300,200); //Glide .override(300,200); Center Cropping [js] view plain copy //Picasso .centerCrop(); //Glide .centerCrop(); Transforming [js] view plain copy //Picasso .transform(newCircleTransform()) //Glide .transform(newCircleTransform(context)) 设置占位图或者加载错误图: [js] view plain copy //Picasso .placeholder(R.drawable.placeholder) .error(R.drawable.imagenotfound) //Glide .placeholder(R.drawable.placeholder) .error(R.drawable.imagenotfound) 几乎和Picasso一样,从Picasso转换到Glide对你来说就是小菜一碟。 有什么Glide可以做而Picasso做不到 Glide可以加载GIF动态图,而Picasso不能。 同时因为Glide和Activity/Fragment的生命周期是一致的,因此gif的动画也会自动的随着Activity/Fragment的状态暂停、重放。Glide 的缓存在gif这里也是一样,调整大小然后缓存。 但是从我的一次测试结果来看Glide 动画会消费太多的内存,因此谨慎使用。 除了gif动画之外,Glide还可以将任何的本地视频解码成一张静态图片。 还有一个特性是你可以配置图片显示的动画,而Picasso只有一种动画:fading in。 最后一个是可以使用thumbnail()产生一个你所加载图片的thumbnail。 其实还有一些特性,不过不是非常重要,比如将图像转换成字节数组等。 配置 有许多可以配置的选项,比如大小,缓存的磁盘位置,最大缓存空间,位图格式等等。可以在这个页面查看这些配置Configuration。 库的大小 Picasso (v2.5.1)的大小约118kb,而Glide (v3.5.2)的大小约430kb。 Anyway 312KB difference might not be that significant. 不过312kb的差距并不是很重要。 Picasso和Glide的方法个数分别是840和2678个。 必须指出,对于DEX文件65535个方法的限制来说,2678是一个相当大的数字了。建议在使用Glide的时候开启ProGuard。 总结 Glide和Picasso都是非常完美的库。Glide加载图像以及磁盘缓存的方式都要优于Picasso,速度更快,并且Glide更有利于减少OutOfMemoryError的发生,GIF动画是Glide的杀手锏。不过Picasso的图片质量更高。你更喜欢哪个呢? 虽然我使用了很长时间的Picasso,但是我得承认现在我更喜欢Glide。我的建议是使用Glide,但是将Bitmap格式换成 ARGB_8888、让Glide缓存同时缓存全尺寸和改变尺寸两种。 相关资源 -Glide 3.0: a media management library for Android -Glide Wiki -Android Picasso vs Glide -Android: Image loading libraries Picasso vs Glide 本文转自wanqi博客园博客,原文链接:http://www.cnblogs.com/wanqieddy/p/4479868.html,如需转载请自行联系原作者

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

1.4 Ecosystem官网剖析(博主推荐

一切来源于官网 http://kafka.apache.org/documentation/ 1.4 Ecosystem 生态系统 There are a plethora of tools that integrate with Kafka outside the main distribution. Theecosystem pagelists many of these, including stream processing systems, Hadoop integration, monitoring, and deployment tools. 还有很多与kafka集成的外部的工具。更多信息点击这里,包含了stream处理系统,hadoop的集成,监控和部署工具。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/6767437.html,如需转载请自行联系原作者

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

微服务系列-Spring Cloud优质项目推荐

Spring Cloud 微服务架构集大成者,云计算最佳业务实践。 image.png Spring Cloud Spring Cloud Config Spring 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。 Spring Cloud Bus Spring 事件、消息总线,用于在集群(例如,配置变化事件)中传播状态变化,可与Spring Cloud Config联合实现热部署。 Eureka Netflix 云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移。 Eureka Server会提供服务注册服务,各个服务节点启动后,会在Eureka Server中进行注册,这样Eureka Server中就有了所有服务节点的信息,并且Eureka有监控页面,可以在页面中直观的看到所有注册的服务的情况。 Eureka有心跳机制,当某个节点服务在规定时间内没有发送心跳信号时,Eureka会从服务注册表中把这个服务节点移除。Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端仍可以利用缓存中的信息调用服务节点的服务。 Eureka一般配合Ribbon进行使用,Ribbon提供了客户端负载均衡的功能,Ribbon利用从Eureka中读取到的服务信息,在调用服务节点提供的服务时,会合理的进行负载。 Eureka通过心跳检测、健康检查、客户端缓存等机制,保证了系统具有高可用和灵活性。 Hystrix Netflix 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 使用Hystrix实现自动降级与依赖隔离-微服务 Zuul Netflix Zuul 是在云平台上提供动态路由,监控,弹性,安全等边缘服务的框架。Zuul 相当于是设备和 Netflix 流应用的 Web 网站后端所有请求的前门。 Netflix Zuul与Nginx 性能对比 Archaius Netflix 配置管理API,包含一系列配置管理API,提供动态类型化属性、线程安全配置操作、轮询框架、回调机制等功能。 archaius是Netflix公司开源项目之一,基于java的配置管理类库,主要用于多配置存储的动态获取。主要功能是对apache common configuration类库的扩展。在云平台开发中可以将其用作分布式配置管理依赖构件。 《Netflix Archaius 分布式配置管理依赖构件》 Consul HashiCorp 封装了Consul操作,consul是一个服务发现与配置工具,与Docker容器可以无缝集成。 Spring Cloud for Cloud Foundry Pivotal 通过Oauth2协议绑定服务到CloudFoundry,CloudFoundry是VMware推出的开源PaaS云平台。 Spring Cloud Sleuth Spring 日志收集工具包,封装了Dapper和log-based追踪以及Zipkin和HTrace操作,为SpringCloud应用实现了一种分布式追踪解决方案。 Spring Cloud Data Flow Pivotal 大数据操作工具,作为Spring XD的替代产品,它是一个混合计算模型,结合了流数据与批量数据的处理方式。 Spring Cloud Security Spring 基于spring security的安全工具包,为你的应用程序添加安全控制。 Spring Cloud Zookeeper Spring 操作Zookeeper的工具包,用于使用zookeeper方式的服务发现和配置管理。 Spring Cloud Stream Spring 数据流操作开发包,封装了与Redis,Rabbit、Kafka等发送接收消息。 Spring Cloud CLI Spring 基于 Spring Boot CLI,可以让你以命令行方式快速建立云组件。 Ribbon Netflix 提供云端负载均衡,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。 Ribbon 是 Netflix 发布的云中间层服务开源项目,其主要功能是提供客户侧软件负载均衡算法,将 Netflix 的中间层服务连接在一起。 特性: Multiple and pluggable load balancing rules Integration with service discovery Built-in failure resiliency Cloud enabled Clients integrated with load balancers Archaius configuration driven client factory Turbine Netflix Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下hystrix的metrics情况。 Feign OpenFeign Feign是一种声明式、模板化的HTTP客户端。 通过Feign, 我们能把HTTP远程调用对开发者完全透明,得到与调用本地方法一致的编码体验。这一点与阿里Dubbo中暴露远程服务的方式类似,区别在于Dubbo是基于私有二进制协议,而Feign本质上还是个HTTP客户端。如果是在用Spring Cloud Netflix搭建微服务,那么Feign无疑是最佳选择。 Spring Cloud Task Spring 提供云端计划任务管理、任务调度。 Spring Cloud Connectors Spring 便于云端应用程序在各种PaaS平台连接到后端,如:数据库和消息代理服务。 Spring Cloud Cluster Spring 提供Leadership选举,如:Zookeeper, Redis, Hazelcast, Consul等常见状态模式的抽象和实现。 Spring Cloud Starters Pivotal Spring Boot式的启动项目,为Spring Cloud提供开箱即用的依赖管理。 个人介绍: 高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能互联网架构。 本文首发在 高广超的简书博客 转载请注明! image.png

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

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

用户登录
用户注册