首页 文章 精选 留言 我的

精选列表

搜索[索引崩溃],共10000篇文章
优秀的个人博客,低调大师

03.自定义View(AlphabetView字母索引View)

感谢红橙Darren博主 package com.rzm.commonlibrary.views; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.TypedValue; import android.view.MotionEvent; import android.view.View; import com.rzm.commonlibrary.R; /** * Created by renzhenming on 2018/3/24. * 实现根据字母分类排序的列表,多用于地址选择或者手机通讯录 */ public class AlphabetView extends View{ //普通模式绘制的画笔 private final Paint mPaint; //触摸时绘制用的画笔 private final Paint mTouchPaint; //默认字母大小 private int mTextSize = 16; //默认字母颜色 private int mTextColor = Color.BLACK; //触摸时字母颜色 private int mTouchTextColor = Color.RED; //控件的高度 private int mViewHeight; //26个字母 private String mLetters[] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N" ,"O","P","Q","R","S","T","U","V","W","X","Y","Z"}; private int mItemHeight; //当前触摸的字母 private String mCurrentTouchLetter; //当前是否在触摸 private boolean mCurrentIsTouch = false; //抬起之后是否清除当前选中的高亮颜色 private boolean mClearAfterUp = true; public AlphabetView(Context context) { this(context,null); } public AlphabetView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,-1); } public AlphabetView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //获取自定义属性 TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlphabetView); mTextColor = typedArray.getColor(R.styleable.AlphabetView_textColor, mTextColor); mTouchTextColor = typedArray.getColor(R.styleable.AlphabetView_touchTextColor, mTouchTextColor); mTextSize = typedArray.getDimensionPixelSize(R.styleable.AlphabetView_textSize, mTextSize); typedArray.recycle(); //设置画笔用于绘制字母 /** * 为什么使用两个画笔而不是单独的使用一个然后切换颜色的设置,因为paint是有一个 * 设置颜色的方法的setColor,我们看一下setColor的源码,发现是native方法实现的, * private static native void nSetColor(long paintPtr, @ColorInt int color); * 如果在onDraw中频繁的切换颜色性能会降低,所以这就是通常使用几种颜色定义几个画笔 * 的原因 */ mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setDither(true); mPaint.setColor(mTextColor); mPaint.setTextSize(sp2px(mTextSize)); mTouchPaint = new Paint(); mTouchPaint.setAntiAlias(true); mTouchPaint.setDither(true); mTouchPaint.setColor(mTouchTextColor); mTouchPaint.setTextSize(sp2px(mTextSize)); } private float sp2px(int sp){ return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,sp,getResources().getDisplayMetrics()); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //根据布局中设置的宽度模式确定宽度 int width =0; int mode = MeasureSpec.getMode(widthMeasureSpec); if (mode == MeasureSpec.EXACTLY){ width = MeasureSpec.getSize(widthMeasureSpec); } if (mode == MeasureSpec.AT_MOST){ //计算宽度,两边的padding加上文字宽度,这个文字随意,不过最好是26个字母中最宽的 float textWidth = mPaint.measureText(""); width = (int) (getPaddingLeft() + getPaddingRight()+textWidth); } //获取设置的高度 mViewHeight = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(width, mViewHeight); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //获取每个字母占的高度 mItemHeight = (getHeight()-getPaddingTop() - getPaddingBottom())/mLetters.length; //绘制26个字母 for (int i = 0; i < mLetters.length; i++) { //得到每个字母的中心位置,防止给布局设置了paddingTop,所以这里+上 int letterCenterY = i* mItemHeight + mItemHeight /2+getPaddingTop(); //得到每个字母的中心位置 Paint.FontMetrics fontMetrics = mPaint.getFontMetrics(); int dy = (int) ((fontMetrics.bottom - fontMetrics.top)/2 - fontMetrics.bottom); //根据字母中心位置求字母的基线 //baseline = center + (FontMetrics.bottom - FontMetrics.top)/2 - FontMetrics.bottom; int baseLine = letterCenterY+dy; //获取每一个字母绘制的x坐标 float letterWidth = mPaint.measureText(mLetters[i]); //确保每一个字母都在中间位置 int x = (int) (getWidth()/2 - letterWidth/2); //开始绘制 /** * text 需要绘制的文字 x 绘制文字原点X坐标 y 绘制文字原点Y坐标 xy指的时文字左下角的坐标,也就是基线和文字最左边下方的交点 paint 画笔 */ if (mLetters[i].equals(mCurrentTouchLetter)){ canvas.drawText(mLetters[i],x,baseLine,mTouchPaint); }else{ canvas.drawText(mLetters[i],x,baseLine,mPaint); } } } @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()){ case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: //当前触摸的位置,相对与控件的位置而不是相对于屏幕 float startY = event.getY(); //计算当前字母的位置 int position = (int)startY/mItemHeight; //防止当触摸超出控件范围的时候,设定position值,防止数组越界 if (position <0){ position = 0; } if (position > mLetters.length - 1){ position = mLetters.length - 1; } //滑动过程中如果滑动的位置和上一次相同,就不再处理,减少invalidate的次数 if (mLetters[position].equals(mCurrentTouchLetter)){ return true; } //记录当前触摸的弥足 mCurrentTouchLetter = mLetters[position]; mCurrentIsTouch = true; if (mTouchListener != null){ mTouchListener.onTouch(mCurrentTouchLetter,mCurrentIsTouch); } break; case MotionEvent.ACTION_UP: //抬起时设置为false mCurrentIsTouch = false; if (mTouchListener != null){ mTouchListener.onTouch(mCurrentTouchLetter,mCurrentIsTouch); } if (mClearAfterUp){ //将当前触摸的字母设置为null,up之后重绘界面,清除高亮状态 mCurrentTouchLetter = null; } break; } invalidate(); return true; } /** * 设置手指触摸抬起之后,是否恢复高亮状态为正常状态,默认为true * @param mClearAfterUp */ public void setClearAfterUp(boolean mClearAfterUp) { this.mClearAfterUp = mClearAfterUp; } // 设置触摸监听 private OnAlphabetTouchListener mTouchListener; public void setOnAlphabetTouchListener(OnAlphabetTouchListener touchListener) { this.mTouchListener = touchListener; } public interface OnAlphabetTouchListener { void onTouch(String letter, boolean isTouch); } }

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

全文搜索引擎Elasticsearch的安装过程

Elasticsearch是目前为止比较屌炸天的一款大数据日志收集工具,而且在很多知名大公司比如360、蚂蚁金服、京东、腾讯等都急需这方面的研究人才,在https://elasticsearch.cn/explore/category-12官方网站就有N多Elasticsearch招聘贴。 要安装Elasticsearch,需要在机器里先有java1.8+的环境,我这2个机器都是阿里云centos 7.4 64位纯净系统,配置是2核2G。 首先#yum -y update一波,更新一下最新的yum,在更新的时候呢,也不要干坐着,登陆http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ,下载最新的java安装包,我为了省事直接就选择的tar包,如图: 下载完并且上传之后,执行一下#rpm -qa | grep java,看一下有没有以前老的java,比如: 1 2 3 4 5 6 7 [root@chen-elk-001usr] #rpm-qa|grepjava java-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64 python-javapackages-3.4.1-5.el7.noarch tzdata-java-2014b-1.el7.noarch javapackages-tools-3.4.1-5.el7.noarch java-1.7.0-openjdk-1.7.0 [root@chen-elk-001usr] # 如果有的话就#rpm -e --nodeps加上查询出的java名逐一删除掉java,比如: 1 2 [root@chen-elk-001usr] #rpm-e--nodepsjava-1.7.0-openjdk-headless-1.7.0.51-2.4.5.5.el7.x86_64 [root@chen-elk-001usr] #rpm-e--nodepsjava-1.7.0-openjdk-1.7.0 删除完毕之后,要#java -version检查一下是否已经不会出现版本了。 现在更新也更新完了,以前老的java也干掉了,那么就把jdk-8u151-linux-x64.tar.gz 拆包解压缩到/usr/local里,如图: 然后就#vim /etc/profile,在全文的末尾加上这样的内容: 1 2 3 4 5 6 #java1.8config JAVA_HOME= /usr/local/jdk1 .8.0_151#这里就是jdk1.8的那个路径,根据解压缩的位置而定 JRE_HOME=$JAVA_HOME /jre CLASSPATH=:$JAVA_HOME /lib/dt .jar:$JAVA_HOME /lib/tools .jar:$JRE_HOME /lib/dt .jar PATH=$PATH:$JAVA_HOME /bin :$JRE_HOME /bin export JAVA_HOMEJRE_HOMECLASSPATHPATH 保存退出之后,#source /etc/profile,然后#java -version看一下版本: java 1.8安装完毕,下面就是安装Elasticsearch,直接下载压缩包吧,比较简单暴力。 1 2 3 4 #wgethttps://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.1.zip #unzipelasticsearch-5.5.1.zip #cdelasticsearch-5.5.1/bin #./elasticsearch 启动之后,发现爆了一个错误,"Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x000000008a660000, 1973026816, 0) failed; error='Cannot allocate memory' (errno=12)",如图: vim打开elasticsearch会看到下面这句话 1 #ES_JAVA_OPTS="-Xms8g-Xmx8g"./bin/elasticsearch 这个错误代表8G内存才可以启动elasticsearch,于是就升级到8G,这玩意的确是有钱人玩的东西。 升级之后,再次启动,出现了"can not run elasticsearch as root"这个错误: 既然不让root,那就建立一个新的用户吧: 1 2 3 4 5 roupaddelsearch useradd elsearch-gelsearch-pelasticsearch chown -Relsearch:elsearch/安装路径 /elasticsearch-5 .5.1 cd /安装路径 /elasticsearch-5 .5.1 /bin su elsearch. /elasticsearch 这样就看到正确启动的样子: 如果要后台启动的话,命令就是#su elsearch ./elasticsearch -d。如果你非要用root用户去启动的话,也不是不可以,命令是#./安装路径/bin/elasticsearch -Des.insecure.allow.root=true。 如果启动的时候,爆“max virtual memory areas vm.maxmapcount [65530] is too low”这个错误,那么就先运行如下命令:#sudo sysctl -w vm.max_map_count=262144。 如果启动的时候,爆“max file descriptors [65535] for elasticsearch process is too low, increase to at least [65536]”,那么#vim /etc/security/limits.conf,把文末内容改成这样,改完了之后#sysctl -p即可: 1 2 3 4 5 6 7 #Endoffile rootsoftnofile65535 roothardnofile65535 *softnofile165536 *hardnofile165536 *softnproc2048 *hardnproc4096 启动之后,在命令行里输入#curl localhost:9200,就会返回JSON 对象,包含当前节点、集群、版本等信息。 我这个Elasticsearch版本是5.11,中文教程https://elasticsearch.cn/book/elasticsearch_definitive_guide_2.x/ 已经有点老了,所以研究之路不仅充满荆棘还充满各种墙和英语... 参考资料:http://www.yiibai.com/elasticsearch/ 参考资料:http://www.cnblogs.com/Wolfmanlq/p/5984376.html 最后的最后,如果您觉得本文对您升职加薪有帮助,那么请不吝赞助之手,刷一下下面的二维码,赞助本人继续写更多的博文! 本文转自 苏幕遮618 51CTO博客,原文链接:http://blog.51cto.com/chenx1242/2043924

资源下载

更多资源
Mario

Mario

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

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

WebStorm

WebStorm

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

用户登录
用户注册