Android 自定义图形实例
来源:互联网 发布:办公软件word视频教程 编辑:程序博客网 时间:2024/05/20 05:27
public class CV1 extends View { private Paint paint; private int rect_width = 30; private int rect_space = 20; private int[][] rect_array = {{Color.RED, 300}, {Color.GREEN, 400}, {Color.BLUE, 250}, {Color.YELLOW, 500}, {Color.DKGRAY, 600}}; public CV1(Context context) { super(context); } public CV1(Context context, AttributeSet attrs) { super(context, attrs); init(); } public void init() { paint = new Paint(); paint.setColor(Color.BLACK); paint.setAntiAlias(true); paint.setStrokeWidth(3); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setTextSize(15); canvas.drawText("300", 10, getHeight() - 300 - 50, paint); canvas.drawCircle(50, getHeight() - 350, 5, paint); paint.setStyle(Paint.Style.FILL_AND_STROKE); for (int i = 0; i < rect_array.length; i++) { int left = 50 + (rect_space + rect_width) * i + rect_space; int top = getHeight() - 50 - rect_array[i][1]; paint.setColor(rect_array[i][0]); canvas.drawRect(left, top, left + rect_width, getHeight() - 50, paint); } //绘制虚线 :DashPathEffect虚线的对象 /** * float[]: * 代码当中的数组要求必须是偶数数组,而且必须>=2,指定了多少长度的实线之后在画多少长度的空白, * 举例:如下代码绘制长度为1的实线,在绘制长度为2的空白,绘制长度为3的实线,在绘制长度为4的空白。 * float: 代表其实位置的偏移量 * */ //绘制x轴:// Path path = new Path();// path.moveTo(50, getHeight() - 50);// path.lineTo(getWidth() - 50, getHeight() - 50);// PathEffect effects = new DashPathEffect(new float[]{5, 5, 5, 5}, 1);// paint.setPathEffect(effects);// canvas.drawPath(path, paint); canvas.drawLine(50, getHeight() - 50, getWidth() - 50, getHeight() - 50, paint); //绘制x轴的箭头 canvas.drawLine(getWidth() - 50, getHeight() - 50, getWidth() - 75, getHeight() - 75, paint); canvas.drawLine(getWidth() - 50, getHeight() - 50, getWidth() - 75, getHeight() - 25, paint); //绘制y轴 canvas.drawLine(50, getHeight() - 50, 50, 50, paint); //绘制y轴的箭头 canvas.drawLine(50, 50, 25, 75, paint); canvas.drawLine(50, 50, 75, 75, paint); //绘制x轴y轴焦点 canvas.drawCircle(50, getHeight() - 50, 2, paint); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); }}
<com.example.thinkpad.customview.CustomView1.CV1 android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/rect"/>
效果:
public class CV2 extends View { private Paint paint; private int hours, minutes, seconds; private int defaultLength = 200; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); // getTime(); invalidate(); handler.sendEmptyMessageDelayed(1, 1000); } }; private void initPaint() { paint = new Paint(); paint.setColor(Color.BLACK); paint.setAntiAlias(true); } public CV2(Context context) { super(context); } public CV2(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); getTime(); handler.sendEmptyMessageDelayed(1, 1000); } public void getTime() { Calendar calendar = Calendar.getInstance(); hours = calendar.get(Calendar.HOUR); minutes = calendar.get(Calendar.MINUTE); seconds = calendar.get(Calendar.SECOND); } @Override public void draw(Canvas canvas) { super.draw(canvas); //绘制钟表 //绘制圆心 canvas.drawCircle(getWidth() / 2, getHeight() / 2, 8, paint); //绘制外围表盘 paint.setStrokeWidth(5); paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 10, paint); //绘制内表盘 paint.setStrokeWidth(3); canvas.drawCircle(getWidth() / 2, getHeight() / 2, getWidth() / 2 - 22, paint); //绘制刻度 //绘制钟表上的刻度 paint.setColor(Color.GRAY); for (int i = 0; i < 12; i++) { //保存画布旋转之前的状态 canvas.save(); canvas.rotate(30 * hours + minutes * 0.5f, getWidth() / 2, getHeight() / 2); canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 5, paint); canvas.restore(); } //绘制时分秒针 //绘制时针 canvas.save(); canvas.rotate(30 * hours + minutes * 0.5f, getWidth() / 2, getHeight() / 2); paint.setStrokeWidth(6); canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 5, paint); canvas.restore(); //绘制分针 canvas.save(); canvas.rotate((360 / 60) * minutes, getWidth() / 2, getHeight() / 2); paint.setStrokeWidth(3); canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 4, paint); canvas.restore(); //绘制秒针 canvas.save(); canvas.rotate(6 * seconds, getWidth() / 2, getHeight() / 2); paint.setStrokeWidth(1); canvas.drawLine(getWidth() / 2, getHeight() / 2, getWidth() / 2, getHeight() / 2 - getHeight() / 3, paint); canvas.restore(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int wMode = MeasureSpec.getMode(widthMeasureSpec); int hMode = MeasureSpec.getMode(heightMeasureSpec); //获取到可以设置的最大的尺寸 int wSize = MeasureSpec.getSize(widthMeasureSpec); int hSize = MeasureSpec.getSize(heightMeasureSpec); switch (wMode) { case MeasureSpec.EXACTLY: wSize = hSize = Math.min(wSize, hSize); break; case MeasureSpec.AT_MOST: //宽:wrap_content 高:100 谁小按照谁画 if (hMode == MeasureSpec.AT_MOST || hSize > defaultLength) { wSize = hSize = defaultLength; } else { wSize = hSize; //高比宽小,按照小的画 } break; } setMeasuredDimension(wSize, hSize); }}
<com.example.thinkpad.customview.CustomView2.CV2 android:layout_width="match_parent" android:layout_height="match_parent" />效果:
public class CV4 extends View { private Paint paint; private int sweepAngle = 0; //扫描的起始角度 private int sweepStep = 5; //每次扫描的角度 private int defalut_width = 100; private int default_height = 100; private int circleColor = Color.GRAY; private int sweepColor = Color.GREEN; private int padding = 5; private int startAngle = -90; private void initPaint(){ paint = new Paint(); paint.setAntiAlias(true); paint.setColor(circleColor); } public CV4(Context context) { super(context); } public CV4(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(circleColor); canvas.drawCircle(getWidth()/2,getHeight()/2,getWidth()/2-padding,paint); paint.setColor(sweepColor); /** * 绘制扇形: * 1.rectf:指代扇形的容器,矩形对象, * 2,startAngle:起始的角度 * 3,sweepAngle 扫描的角度 * 4:userCenter : * */ canvas.drawArc(new RectF(padding,padding,getWidth() -padding,getHeight()-padding), startAngle,sweepAngle,true,paint); sweepAngle =sweepAngle+sweepStep; sweepAngle = sweepAngle>360?0:sweepAngle; //重新绘制图形 invalidate(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int wSize = MeasureSpec.getSize(widthMeasureSpec); int hSize = MeasureSpec.getSize(heightMeasureSpec); switch (widthMode) { case MeasureSpec.AT_MOST: wSize = defalut_width; hSize = default_height; break; case MeasureSpec.EXACTLY: wSize = hSize = Math.min(wSize,hSize); break; } setMeasuredDimension(wSize,hSize); }}
<com.example.thinkpad.customview.CustomView4.CV4 android:layout_width="200dp" android:layout_height="200dp" />
效果:
0 0
- Android 自定义图形实例
- Android 自定义图形实例
- android 图形开发实例
- Android 自定义图形 shape
- android自定义drawable图形
- Android 自定义进度图形
- Android自定义图形-Shape
- android 使用自定义图形背景
- Android 自定义shape图形效果
- Android系列: 自定义图形shape
- android自定义控件实例
- android自定义控件实例
- android自定义控件实例
- android自定义控件实例
- android自定义控件实例
- Android自定义属性实例
- Android自定义UI实例
- android自定义控件实例
- html 02 css控制之css选择器及其优先级
- Python 爬虫
- 2016CCPC东北-B.Mr. Frog’s Problem
- 14. Longest Common Prefix
- hibrenate @ManyToOne(fetch = FetchType.EAGER) 和 lazy 区别
- Android 自定义图形实例
- MATLAB图形用户界面设计GUI
- 我终于连接access到jsp中啦!
- java.lang.NoSuchMethodException异常解决
- 自定义对话框学习记录01
- leetcode Binary Tree Zigzag Level Order Traversal C++
- 10-06
- HashSet用法
- 剑指offer(5)-调整数组顺序使得奇数位于偶数之前