简单的重写控件

我们知道最基本的就是继承View,下面我们结合一个例子对重写进行简单地分析:

       继承一个view,都会有一个或多个构造方法,在不同的时候调用到不同的构建方法,一般会重写三个方法,onMeasure();onLayout();onDraw();分别是测量,定位和画

下面说下,android中重写view时,经常会遇到的混淆:

requestLayout(),invalidate(),postInvalidate()方法

requestLayout:当view确定自身已经不再适合现有的区域时,该view本身调用这个方法要求parent view重新调用他的onMeasure onLayout来对重新设置自己位置。特别是当view的layoutparameter发生改变,并且它的值还没能应用到view上,这时候适合调用这个方法。

invalidate:是view调用本身的方法,强制view进行刷新,是用来刷新View的,必须是在UI线程中进行工作。比如在修改某个view的显示时,调用invalidate()才能看到重新绘制的界面。它是UI线程(即主线程)中调用,一般在代码中的handlermessage中,收到返回的消息调用。

postInvalidate:与invalidate相似,但是是在子线程中调用,相对来说比较简单。

最后我们就结合下面这个例子:讲解如果我们想在初始化的时候做一些操作,一般都会在里面写个方法,里面会new一个画笔,设置画笔的一些属性比如颜色,大小之类的。以及画布的旋转,平移之类的。

package com.example.demo;

import android.content.Context;

import android.content.res.TypedArray;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.util.AttributeSet;

import android.view.View;

public class InfoDialView extends View{

private Paint percentPaint;

private Paint textPaint;

private int textSize = 50;

private int percent;

private int usedColor;

private int percentLineColorLow;

private int percentLineColorHight;

private int allLineWidth = 3;

private int percentLineWidth = 4;

private int lineHeight = 10;

private float maxValue = 100.00f;

private float curValue = 0.00f;

private int tipTextSize = 15;

private Bitmap icon;

public InfoDialView(Context context) {

super(context);

init(null, 0);

}

public InfoDialView(Context context, AttributeSet attrs) {

super(context, attrs);

init(attrs, 0);

}

public InfoDialView(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs,defStyle);

init(attrs,defStyle);

}

private void init(AttributeSet attrs, int defStyle) {

// TODO Auto-generated method stub

final TypedArray a = getContext().obtainStyledAttributes(

attrs, R.styleable.InfoDialView, defStyle, 0);   //得到一些自定义属性

maxValue = a.getFloat(R.styleable.InfoDialView_maxValue, 0.0f);

curValue = a.getFloat(R.styleable.InfoDialView_currentValue, 0.0f);

usedColor = a.getColor(R.styleable.InfoDialView_usedColor, Color.GRAY);

percentLineColorLow = a.getColor(R.styleable.InfoDialView_percentLineColorLow, Color.GREEN);

percentLineColorHight = a.getColor(R.styleable.InfoDialView_percentLineColorHight, Color.RED);

a.recycle();  //不要忘记回收

percent = (int)(curValue*100/maxValue);

percentPaint = new Paint();//设置画笔

percentPaint.setAntiAlias(true);

textPaint = new Paint();

textPaint.setTextSize(textSize);

textPaint.setAntiAlias(true);

icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon_syrl);

}

@Override

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int width = getMeasuredWidth();

int height = getMeasuredHeight();

int pointX =  width/2;

int pointY = height/2;

float textWidth = textPaint.measureText((maxValue-curValue)+"");

textPaint.setColor(Color.WHITE);

canvas.drawText((maxValue-curValue)+"",pointX - textWidth/2,pointY + textPaint.getTextSize()/2 ,textPaint);

Paint paint = new Paint();

paint.setTextSize(tipTextSize);

paint.setAntiAlias(true);

float tipW = paint.measureText("剩余热量(kwh)");

paint.setColor(Color.WHITE);

canvas.drawBitmap(icon, pointX -icon.getWidth()/2-tipW/2-15,pointY - textPaint.getTextSize()/2-13-icon.getHeight()/2, null);

canvas.drawText("剩余热量(kwh)", pointX-tipW/2, pointY - textPaint.getTextSize()/2-paint.getTextSize()/2, paint);

if(percent<80){

percentPaint.setColor(percentLineColorLow);

}else{

percentPaint.setColor(percentLineColorHight);

}

percentPaint.setStrokeWidth(allLineWidth);

float degrees = (float) (320.0/100);

canvas.save();
//在旋转画布前先保存画布,不然原来画得可能找不到了。

canvas.translate(0,pointY);

canvas.rotate(-70, pointX, 0);

for(int i = 0;i<100;i++){

canvas.drawLine(0, 0, lineHeight, 0, percentPaint);

canvas.rotate(degrees, pointX, 0);

}

canvas.restore(); //重新加载之前保存的画布,一个save,都会有个resore与之对应

percentPaint.setColor(usedColor);

percentPaint.setStrokeWidth(percentLineWidth);

canvas.save();

canvas.translate(0,pointY);

canvas.rotate(-70, pointX, 0);

for(int i = 0;i<percent;i++){

canvas.drawLine(0, 0, lineHeight, 0, percentPaint);

canvas.rotate(degrees, pointX, 0);

}

canvas.restore();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {//测量

// TODO Auto-generated method stub

//super.onMeasure(widthMeasureSpec, heightMeasureSpec);

int width = MeasureSpec.getSize(widthMeasureSpec);

int height = MeasureSpec.getSize(heightMeasureSpec);

int d = (width >= height) ? height : width;

setMeasuredDimension(d,d);

}

public void setValue(float maxValue,float currentValue) {//供外部调用的方法

this.maxValue = maxValue;

this.curValue = currentValue;

postInvalidate();

}

}

有问题,欢迎大家私信交流。。。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-19 15:18:28

简单的重写控件的相关文章

简单测试用控件.

props.push('{"prop":"x","min":-100,"max":100}'); props.push('{"prop":"y","min":-100,"max":100}'); props.push('{"prop":"scaleX","min":-1,"max

如何在Android实现桌面清理内存简单Widget小控件

如何在Android实现桌面清理内存简单Widget小控件 我们经常会看到类似于360.金山手机卫士一类的软件会带一个widget小控件,显示在桌面上,上面会显示现有内存大小,然后会带一个按键功能来一键清理内存,杀死后台进程的功能,那么这个功能是如何实现的呢,我们今天也来尝试做一个类似的功能的小控件. 效果图: 一.UI部分的编写: 参照Google的文档,首先在建立一个类继承AppWidgetProvider import android.appwidget.AppWidgetProvider

时间控件-简单的时间控件

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title></title> <script src="Scripts/jquery-1.10.2.js"><

C# winform窗体简单保存界面控件参数到xml

原文:C# winform窗体简单保存界面控件参数到xml 引用网上的 XMLHelper 地址 :https://www.cnblogs.com/chnboy/archive/2009/04/02/1427652.html 稍做修改 using System; using System.Linq; using System.Xml; namespace FormTest { /// <summary> /// XMLHelper XML文档操作管理器 /// </summary>

用wpf实现简单的柱状图控件

因为最近的一个项目里需要用到柱状图,找了一些第三方的控件,UI部分定制化不强,很难保证与现有界面的统一.项目当中用到的图形也比较简单,所以干脆自己动手实现. 下面是最终的效果. 首先讲一下设计思路 图形控件主要分为四部分:一水平文本,垂直文本,背景线条,以及最主要的柱形部分. 第一步先绘制背景,因为水平文本和垂直文本都是根据数据源动态计算的,所以内容无法固定.为了方便计算这里以Grid控件为基类,在Grid的基础上进行绘制,因为通过添加Grid的行和列能够很好的控制控件内容的布局. 1 clas

用C# WPF简单实现仪表控件

时间如流水,只能流去不流回! 点赞再看,养成习惯,这是您给我创作的动力! 本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform.WPF.ASP.NET Core等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的.自己会的. 阅读导航: 一.先看效果二.本文背景三.代码实现四.文章参考五.代码下载 一.先看效果 二.本文背景 小编全程是看 Design com WPF 大神视频手敲的仪表控件代码,

在iOS上实现一个简单的日历控件

转自:http://blog.csdn.net/jasonblog/article/details/21977481 近期需要写一个交互有点DT的日历控件,具体交互细节这里略过不表. 不过再怎么复杂的控件,也是由基础的零配件组装起来的,这里最基本的就是日历控件. 先上图: 从图中可以看出日历控件就是由一个个小方块组成的,每一行有7个小方块,分别表示一周的星期天到星期六. 给定一个月份,我们首先需要知道这个月有多少周.那么如何确定一个月有多少周呢? 我是这么想的,在NSDate上做扩展: [cpp

Javascript jquery css 写的简单进度条控件

很多的时候用户需要等待你“臃肿”的 Javascript 代码处理完成(Web 2.0 的特色).期间或许加入一个类似于进度条的东西让用户有点“安慰”.这个东西实现起来并不复杂,无非就是获得总的处理条目,然后获得一个百分比,再显示输出. 通过我们伟大的 CSS,可以实现非常漂亮的进度条样式.加上 Javascript 的效果,就可以完全“欺骗”我们的用户,让他们有耐心等待浏览器处理完成.上述的原理已经知道了,那么就可以直接看代码了.本人使用的还是 jQuery 框架,因为这样简短的代码可能会更容

重写控件

自定义ListBox类 C# code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class myListBox : System.Windows.Controls.ListBox { protected override DependencyObject GetContainerForItemOverride() { return new myL