韩奇峰高级讲师
多年实战工作经验曾参与制作宝马Usage Training项目、DMS项目,奥迪全 息投影项目,奔驰等多家汽车门户行业大型项目,负责UI设计、界面设计、3D模型制作、前端开发等职务。
从事设计行业多年,精通PhotoShop、UI设计、AfterEffects、Flash、 Actionscript、HTML、CSS、JavaScript、jQuery、资深动画设计师,设计作品曾获得全国动画设计三等奖。
课程讲解注重实战应用,对讲述知识点穿插案例制作,使课程内容更加接近 工作中实际的项目。授课风格注重实战经验分析,深受学生喜欢。
现在学习Java还有前途吗?
在互联网行业,Java工程师是一个技术含量非常高的岗位,支撑了互联网行 业的半壁江山,全世界有一千万Java程序员,目前还在有更多的计算机爱好者向Java的大门奔来。Java发展了20多年,关于Java的悲观论调也不时出现 ,现在学Java还有前途吗?是否已经过了红利期了呢?
Java作为所有编程语言中热门技术,可以说它无处不在,目前全球有着数十 亿的设备正在运行着Java,很多服务器程序都是用Java编写,用以处理每天超过数以千万的数据。
无论是手机软件、手机Java游戏还是电脑软件,每一次购物到每一笔支付成 功,都离不开Java,越来越多的企业也正采用Java语言开发网站,而在所有程序员中,Java开发工程师就占据了20%的比例。
从国内排名靠前网站的主要开发语言,也可以看出Java在各大开发语言中的 地位。淘宝、搜狐、网易等一线互联网公司,都在使用Java开发语言。
这也不难理解,为什么Java现在这么火爆,吸引越来越多的人学习,根本原 因,还是因为企业对Java的认可和应用。
Java有没有前途,需要我们认清自己今后应该怎么走自己的路线,是走技术 ,还是走管理。走技术路线:从初级、中级、高级再到软件架构师。如果说走管理路线:项目经理、部门经理、技术总监。只有清楚了自己要走的路线 后,再往决定的那一方面去努力,学习。除此以外,还有一些人学了这一专业后,从事销售顾问、培训讲师、自己创业的都有,关键是自己要认识自己 ,自己更适何哪一条路。
所以,先认清“正确的结果”,根据正确的结果去设计你的过程。当一个人 具有明确的职业目标时,就会对有助于实现目标的蛛丝马迹都特别敏感,做事情相应也就会很有目的性,而不是稀里糊涂的。所以,就容易到达自己的 目的。如果没有职业目标,脚踩西瓜皮滑到哪里是哪里,学什么技术都没前途。
在未来的几年,Java工程师人才的需求还在不断的加大,由于人才的紧缺, 这个岗位相对于其它专业薪资待遇还是不错的,而且Java工程师的待遇是与工作经验直接挂勾的,当你有了丰富的经验以后,你在这个行业里就比较抢 手了,而且企业所出的薪酬也是相当高的,到时只有你选择他们了。
Java开发体系结构介绍 :
Java开发体系结构介绍 :
1、类加载器:为程序的执行加载所需要的全部类。类加载器将本地文件系 统的类名空间与来自远程网络源的类名空间相分离,本地类总是首先被加载,以增加安全性。当全部类被加载后,可执行文件的存储器格式被确定。这 时,特定的存储器地址被分配给符号引用并创建检索表格。由于存储器格式在运行时出现,因而Java解释器增加了保护以防止对限制代码区的非法进入 。
2、字节代码校验器:基于代码的规范包括语法语义的检查以及如上所述的 安全性检查。
3、Java运行时解释器:它是JVM的核心内容,实现把抽象的字节码指令映射 到本地系统平台下的库引用或指令。
4、API类库:实现标准Java平台API的一系列可执行代码。
5、硬件本地平台接口:提供对底层系统平台资源库调用的接口。
仿华为天气预报UI
>
近来公司事前较少,再来找几个有意思的View练练手,下面是原生华为天气预报界面:
下面是仿的UI交互效果:
**思路: 1.平移画布到View中心,先绘制一个圆弧,绘制中间文字 2.旋转画布,绘制小短线,同时绘制中间的温度和下边的图片 3.确定0摄氏度的位置,确定每日温差之间共覆盖多少角度 4.算出**小温度的起始角,根据cos,sin计算坐标,绘制温度数字。 5.算出**小温度的短线索引,加粗变色绘制。**
1.首先在onMeasure中保证View宽高。
@Override PRotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int wrap_Len = 600; int width = measureDimension(wrap_Len, widthMeasureSpec); int height = measureDimension(wrap_Len, heightMeasureSpec); int len=Math.min(width,height); //保证是一个正方形 setMeasuredDimension(len,len); } public int measureDimension(int defaultSize, int measureSpec){ int result; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if(specMode == MeasureSpec.EXACTLY){ result = specSize; }else{ result = defaultSize; //UNSPECIFIED if(specMode == MeasureSpec.AT_MOST){ result = Math.min(result, specSize); } } return result; } 然后开始平移画布,绘制一个圆弧 mWidth=getWidth(); mHeight=getHeight(); radius=(mWidth-getPaddingLeft()-getPaddingRight())/2;//半径 canvas.translate(mWidth/2,mHeight/2); private void drawArcView(Canvas canvas) { RectF mRect=new RectF(-radius,-radius,radius,radius); //canvas.drawRect(mRect,mArcPaint); canvas.drawArc(mRect,startAngle,sweepAngle,false,mArcPaint); }效果如图:
2.旋转画布,绘制小短线 以一定的角度旋转画布,循环画出短线
private void drawLine(Canvas canvas) { canvas.save(); float angle = (float)sweepAngle/count;//刻度间隔 canvas.rotate(-270 startAngle);//将起始刻度点旋转到正上方 for(int i=0;i<=count;i ){ if(i==0 || i==count){ mLinePaint.setStrokeWidth(1); mLinePaint.setColor(Color.WHITE); canvas.drawLine(0,-radius,0,-radius 40,mLinePaint); }else if(i>=getStartLineIndex(minTemp,maxTemp) && i<=getEndLineIndex(minTemp,maxTemp)){ mLinePaint.setStrokeWidth(3); mLinePaint.setColor(getRealColor(minTemp,maxTemp)); canvas.drawLine(0,-radius,0,-radius 30,mLinePaint); }else { mLinePaint.setStrokeWidth(2); mLinePaint.setColor(Color.WHITE); canvas.drawLine(0,-radius,0,-radius 30,mLinePaint); } canvas.rotate(angle);//逆时针旋转 } canvas.restore(); }效果如图:
然后绘制中间的温度和下边的图片,并注释掉绘制圆环的方法
private void drawTextBitmapView(Canvas canvas) { mTextPaint.setTextSize(144); canvas.drawText(currentTemp "°",0,0 getTextPaintOffset(mTextPaint),mTextPaint); canvas.drawBitmap(bitmap,0-bitmap.getWidth()/2,radius-bitmap.getHeight()/2-30,null); }其中getTextPaintOffset()函数改变文字的Y坐标偏移量
public float getTextPaintOffset(Paint paint){ Paint.FontMetricsInt fontMetrics = paint.getFontMetricsInt(); return -fontMetrics.descent (fontMetrics.bottom-fontMetrics.top)/2; }效果如图:
3.然后确定0摄氏度在圆环中的位置,设为230度的位置为0度
计算圆环中230度的X,y坐标。 //根据角获得X坐标 R*cos& getTextPaintOffset(mTextPaint)-off private float getCosX(int Angle){ return (float) (radius*Math.cos(Angle*Math.PI/180)) getTextPaintOffset(mTextPaint); } private float getSinY(int Angle){ return (float)(radius*Math.sin(Angle*Math.PI/180)) getTextPaintOffset(mTextPaint); }因为平移的坐标系,此时要根据象限决定偏移量的正负
private float getRealCosX(int Angle,int off,boolean outoff){ if(!outoff){ off=-off; } if(getCosX(Angle)<0){ return getCosX(Angle)-off; }else{ return getCosX(Angle) off; } } private float getRealSinY(int Angle,int off,boolean outoff){ if(!outoff){ off=-off; } if(getSinY(Angle)<0){ return getSinY(Angle)-off; }else{ return getSinY(Angle) off; } }有了正确的X,Y坐标即可绘制出文字。有了0摄氏度的位置就能确定当天温度范围的具体角。
//根据当天温度范围获得扇形开始角。 private int getStartAngle(int minTemp,int maxTemp){ int startFgAngle=0; if(minTemp>=maxTemp){ Log.e("ws","getStartAngle---?fail"); return startFgAngle; } if(minTemp<=0){ startFgAngle=ocAngle - (0 - minTemp)*fgAngle/(maxTemp-minTemp); }else{ startFgAngle=ocAngle (minTemp-0)*fgAngle/(maxTemp-minTemp); } //边界 start if(startFgAngle<=startAngle){//如果开始角小于startAngle,防止过边界 startFgAngle=startAngle 10; }else if((startFgAngle fgAngle)>=(startAngle sweepAngle)){//如果结束角大于(startAngle sweepAngle) startFgAngle =startAngle sweepAngle-20-fgAngle; } //边界 end return startFgAngle; }求出具体角后就可以确定X,Y坐标了
private void drawTempLineView(Canvas canvas) { mTextPaint.setTextSize(24); canvas.drawText("0°C",getRealCosX(ocAngle,offset,true),getRealSinY(ocAngle,offset,true),mTextPaint);//固定0度的位置 int startTempAngle=getStartAngle(minTemp,maxTemp); /* if(startTempAngle<=startAngle){//如果开始角小于startAngle,防止过边界 startTempAngle=startAngle 10; }else if((startTempAngle fgAngle)>=(startAngle sweepAngle)){//如果结束角大于(startAngle sweepAngle) startTempAngle =startAngle sweepAngle-20-fgAngle; }*/ canvas.drawText(minTemp "°", getRealCosX(startTempAngle, offset,true), getRealSinY(startTempAngle, offset,true), mTextPaint); canvas.drawText(maxTemp "°", getRealCosX(startTempAngle fgAngle, offset,true), getRealSinY(startTempAngle fgAngle, offset,true), mTextPaint); // int circleAngle = startTempAngle (currentTemp-minTemp)*fgAngle/(maxTemp-minTemp); // mPointPaint.setColor(getRealColor(minTemp,maxTemp)); //canvas.drawCircle(getRealCosX(circleAngle,50,false),getRealSinY(circleAngle,50,false),7,mPointPaint); }
然后就是要绘制这段温度范围的线颜色,以及当前温度的点 绘制点:
int circleAngle = startTempAngle (currentTemp-minTemp)*fgAngle/(maxTemp-minTemp); mPointPaint.setColor(getRealColor(minTemp,maxTemp)); canvas.drawCircle(getRealCosX(circleAngle,50,false),getRealSinY(circleAngle,50,false),7,mPointPaint);绘制当天温度范围的线,即在drawLine方法中加上
else if(i>=getStartLineIndex(minTemp,maxTemp) && i<=getEndLineIndex(minTemp,maxTemp)){ mLinePaint.setStrokeWidth(3); mLinePaint.setColor(getRealColor(minTemp,maxTemp)); canvas.drawLine(0,-radius,0,-radius 30,mLinePaint); //根据当天温度范围获取开始短线的索引 private int getStartLineIndex(int minTemp,int maxTemp){ return (getStartAngle(minTemp,maxTemp)-startAngle)/(sweepAngle/count); } private int getEndLineIndex(int minTemp,int maxTemp){ return (getStartAngle(minTemp,maxTemp)-startAngle)/(sweepAngle/count) fgAngle/(sweepAngle/count); } //根据温度返回颜色值 public int getRealColor(int minTemp,int maxTemp){ if(maxTemp<=0){ return Color.parseColor("#00008B");//深海蓝 }else if(minTemp<=0 && maxTemp>0){ return Color.parseColor("#4169E1");//黄君兰 }else if(minTemp>0 && minTemp<15 ){ return Color.parseColor("#40E0D0");//宝石绿 }else if(minTemp>=15 && minTemp<25){ return Color.parseColor("#00FF00");//酸橙绿 }else if(minTemp>=25 &&minTemp<30){ return Color.parseColor("#FFD700");//金色 }else if(minTemp>=30){ return Color.parseColor("#CD5C5C");//印度红 } return Color.parseColor("#00FF00");//酸橙绿; }**终效果图
相关推荐: