android view的自定义

public class YanghangCreditCircle extends View {

    private static final String TAG = "YanghangCreditCircle";

    private int resid = R.drawable.credit_report_turntable;
    public YanghangCreditCircle(Context context) {
        super(context);
        init();
    }

    public YanghangCreditCircle(Context context, AttributeSet attrs) {
        super(context, attrs);
        TypedArray t = getContext().obtainStyledAttributes(attrs,R.styleable.YanghangCreditCircle);
        resid = t.getResourceId(R.styleable.YanghangCreditCircle_itembackground,R.drawable.credit_report_turntable);
        init();
    }

    private void init() {
        progressPen = new Paint();
        progressPen.setAntiAlias(true);
        progressPen.setStyle(Paint.Style.STROKE);
        progressPen.setColor(Color.WHITE);
        progressPen.setStrokeWidth(margin);//画笔框的宽度margin,画笔从中间画

        circleBmp = BitmapFactory.decodeResource(getResources(), resid);
        bmpPaint.setAntiAlias(true);
    }

//    private float outsidePenSize;
    private Paint progressPen;

    private Bitmap circleBmp;
    private float degress = 0;
    float margin = UIUtil.INSTANCE.DipToPixels(10);
    private Paint bmpPaint = new Paint();

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        float width = circleBmp.getWidth() + (margin) * 2;
        float height = circleBmp.getHeight() + (margin)*2;
        widthMeasureSpec = MeasureSpec.makeMeasureSpec((int) width, MeasureSpec.EXACTLY);
        heightMeasureSpec = MeasureSpec.makeMeasureSpec((int) height, MeasureSpec.EXACTLY);
        setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
    }

    public void setProgress(float degress){
        this.degress = 5f + 205f*degress;
        postInvalidate();//刷新onDraw
    }

    public void setdegressProgress(float degress) {
        this.degress = degress;
        postInvalidate();
    }
//    (  0,700] E
//            (700,840] D
//             (840,890] C
//             (890,930] B
//             (930,1000] A

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Rect rect = new Rect();
        getDrawingRect(rect);

        int bmpWidth = (int) (circleBmp.getWidth() / 2.0f);
        int bmpHeight = (int) (circleBmp.getHeight() / 2.0f);
        Rect dstRect = new Rect();
        dstRect.set(rect.centerX() - bmpWidth, rect.centerY() - bmpHeight,
                rect.centerX() + bmpWidth, rect.centerY() + bmpHeight);//canvas上的目标区域

        RectF outsideCircleRect = new RectF(dstRect.left + margin/2, dstRect.top + margin/2, dstRect.left + dstRect.width() - margin/2,
                dstRect.top + dstRect.width() - margin/2);

        canvas.drawBitmap(circleBmp, null, dstRect, bmpPaint);//显示整个图片在特定的矩形区域内
        progressPen.setAlpha(100);

        canvas.drawArc(outsideCircleRect, 160f, degress, false, progressPen);

        float tmpDegress = degress;
        canvas.save();

    }
}

  

时间: 2024-10-03 22:49:28

android view的自定义的相关文章

Android开发之自定义View-可动画展开收缩View的实现

有时候需要点击一个view可以动画展开和收缩折叠一个View这样的效果,这样就可以直接自定义View来实现. 本例中,采用继承FrameLayout来实现自定义的ExpandView.下面将详细介绍各个部分来实现该类以及如何使用该自定义视图. 效果图如下: 未展开效果: 正在向上折叠收缩中的效果: 已经展开效果: 自定义展开类:ExpandView的实现: package com.czm.customview; import android.content.Context; import and

进阶篇-用户界面:5.android绘图api自定义View(视图)

1.自定义视图并为其添加属性     我们平时用的Button啊 TextView啊都是安卓中系统自带的控件供开发者使用,但是,这些事远远不够的,有时候我们需要自定义控件. (1)新建一个类MyView使其继承View 类 import android.content.Context; import android.content.res.TypedArray; import android.util.AttributeSet; import android.view.View; /** * C

Android中使用自定义View实现下载进度的显示

一般有下载功能的应用都会有这样一个场景,需要一个图标来标识不同的状态.之前在公司的项目中写过一个,今天抽空来整理一下. 一般下载都会有这么几种状态:未开始.等待.正在下载.下载结束,当然有时候会有下载出错的状态.等待状态是指用户点击开始下载,但是线程池中没有空闲的线程来处理该次下载,所以状态为等待. 效果图: 这里我只是演示了一下下载和暂停的状态,其他状态没有演示,在代码中设置就可以了. 实现代码: 1.自定义View 1 public class DownloadPercentView ext

Android View体系(十一)自定义ViewGroup

相关文章 Android View体系(一)视图坐标系 Android View体系(二)实现View滑动的六种方法 Android View体系(三)属性动画 Android View体系(四)从源码解析Scroller Android View体系(五)从源码解析View的事件分发机制 Android View体系(六)从源码解析Activity的构成 Android View体系(七)从源码解析View的measure流程 Android View体系(八)从源码解析View的layout

Android开发之自定义View专题(二):自定义饼图

在图表里面,常用的图标一般为折线图.柱形图和饼图,上周,博主已经将柱形图分享.在博主的项目里面其实还用到了饼图,但没用到折线图.其实学会了其中一个,再去写其他的,应该都是知道该怎么写的,原理都是自己绘制图形,然后获取触摸位置判定点击事件.好了,废话不多说,直接上今天的饼图的效果图 这次也是博主从项目里面抽离出来的,这次的代码注释会比上次的柱形图更加的详细,更加便于有兴趣的朋友一起学习.图中的那个圆形指向箭头不属于饼图的部分,是在布局文件中为了美化另外添加进去的,有兴趣的朋友可以下载完整的项目下来

Android开发之自定义View专题(一):自定义柱形图

博主之前做的项目中,需要用到报表功能,之前在网上百度谷歌各种结果,没有一个是能够满足博主的老板的需求的,无奈之前博主只好自己去研究.终于研究出了一个不错的结果.先上效果图: 这是博主的一个项目的一个报表.老板要求可以点击左侧的月份进行月份比较,也可以点击选择月份,右边柱形图条状是可以响应点击事件的,并且可以左右滑动切换月份,如果柱形图内容过长超出界面,也是可以左右滑动查看未显示全的内容的.这里只讲柱形图的生成,其他界面效果博主就不讲解了.实际效果和这样有点差异,但不大,主要是实际效果在柱形图的顶

Android开发之自定义View专题(三):自定义GridView

gridview作为android开发中常用的组件,其功能十分强大.但是,我们有时候有很多特殊的需求,需要在其基础上进行改造.有时候会有移动gridView中item位置的需求,这个网上已经有很多例子,博主就不在描述.今天博主讲的是移动gridView中item中的内容.博主没看过网上那些移动item位置的demo,不知道其原理是不是和博主想的一样.博主思考过,似乎博主的这种实现原理似乎也可以用作实现移动item位置.而之前博主百思不得其解的小米手机的桌面的自定义乱序排放,似乎也可以用这个原理去

【Android - View】之自定义View实现“刮刮卡”效果

首先来介绍一下这个自定义View: (1)这个自定义View的名字叫做 GuaguakaView ,继承自View类: (2)这个View实现了很多电商项目中的"刮刮卡"的效果,即用户可以刮开覆盖层,查看自己是否中奖: (3)用户可以设置覆盖层的图片以及显示的文本内容和字体大小等参数: (4)用户可以设置一个阈值,当刮开的面积大于这个阈值时,就会自动清除所有覆盖物. 接下来简单介绍一下在这个自定义View中用到的技术点: (1)自定义属性:在 /res/values/attr.xml 

Android进阶之自定义View实战(二)九宫格手势解锁实现

一.引言 在上篇博客Android进阶之自定义View实战(一)仿iOS UISwitch控件实现中我们主要介绍了自定义View的最基本的实现方法.作为自定义View的入门篇,仅仅介绍了Canvas的基本使用方法,而对用户交互层面仅仅处理了单击事件接口,在实际的业务中,常常涉及到手势操作,本篇博客以九宫格手势解锁View为例,来说明自定义View如何根据需求处理用户的手势操作.虽然九宫格手势解锁自定义View网上资料有很多,实现原理大同小异,但这里我只是根据自己觉得最优的思路来实现它,目的是让更