自定义View--day1

public class MyVolumnView extends View {
    int count_dark = 7;
    final int MAX_COUNT = 15;
    Paint paint;
    Bitmap dark;
    Bitmap light;
    final int SPAN = 5;

    public MyVolumnView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        dark = BitmapFactory.decodeResource(getResources(),
                R.drawable.sound_line1);
        light = BitmapFactory.decodeResource(getResources(),
                R.drawable.sound_line);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        // 画的黑条目
        for (int i = 0; i < count_dark; i++) {
            canvas.drawBitmap(dark,
                    new Rect(0, 0, dark.getWidth(), dark.getHeight()),
                    new Rect(0, i * (dark.getHeight() + SPAN), dark.getWidth(),
                            i * (dark.getHeight() + SPAN) + dark.getHeight()),
                    paint);
        }

        // 画亮条目
        for (int j = count_dark; j < MAX_COUNT; j++) {
            canvas.drawBitmap(light,
                    new Rect(0, 0, dark.getWidth(), dark.getHeight()),
                    new Rect(0, j * (dark.getHeight() + SPAN), dark.getWidth(),
                            j * (dark.getHeight() + SPAN) + dark.getHeight()),
                    paint);
        }
        super.onDraw(canvas);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        //决定控件的宽高
        int realWidth = getRealSize(widthMeasureSpec, true);
        int realHeight = getRealSize(heightMeasureSpec, false);
        this.setMeasuredDimension(realWidth, realHeight);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //触摸事件
        int action = event.getAction();
        float x = 0, y = 0;
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            x = event.getX();
            y = event.getY();
            break;
        case MotionEvent.ACTION_MOVE:
            x = event.getX();
            y = event.getY();
            break;
        case MotionEvent.ACTION_UP:
            x = event.getX();
            y = event.getY();
            break;
        default:
            break;
        }
        if (x > dark.getWidth()) {
            return true;
        }
        float percent = y
                / (MAX_COUNT * dark.getHeight() + (MAX_COUNT - 1) * SPAN);
        if (percent > 1) {
            return true;
        }
        count_dark = (int) (percent * 15);
        this.invalidate();
        // Log.i("INFO", "count of dark is:"+count_dark);
        return true;
    }

    private int getRealSize(int length, boolean isWidth) {
        int realSize = 0;
        int specMode = MeasureSpec.getMode(length);
        int size = MeasureSpec.getSize(length);
        int padding = isWidth ? this.getPaddingLeft() + this.getPaddingRight()
                : this.getPaddingTop() + this.getPaddingBottom();
        if (specMode == MeasureSpec.EXACTLY) {
            realSize = size;
        } else {
            realSize = isWidth ? dark.getWidth() + padding : MAX_COUNT
                    * (dark.getHeight() + padding) + (MAX_COUNT - 1) * SPAN;
            if (specMode == MeasureSpec.UNSPECIFIED) {
                realSize = Math.min(realSize, size);
            }
        }
        Log.i("INFO", "realSize:" + realSize);
        return realSize;
    }
}

自定义View--day1,布布扣,bubuko.com

时间: 2024-10-01 05:54:07

自定义View--day1的相关文章

自定义View 篇三 《手动打造ViewPage》

有了之前自定义View的理论基础,有了ViewPage.事件分发机制.滑动冲突.Scroller使用等相关知识的铺垫,今天纯手动打造一款ViewPage. 1.完成基本的显示: 在MainActivity中: public class MainActivity extends AppCompatActivity { private MyViewPage mViewPage; int[] imageIds = new int[]{ R.drawable.pic_0, R.drawable.pic_

九点(九宫格)式手势解锁自定义view

周末闲着没事,写了个手势解锁的view,实现起来也蛮快的,半天多一点时间就完事.把源码和资源贴出来,给大家分享,希望对大家有用. 效果,就跟手机上的九点手势解锁一样,上个图吧: 过程嘛感觉确实没啥好讲的了,涉及的知识以前的博客都说过了,无非就是canva,paint,touch事件这些,画画圆圈画画线条,剩下的就是细节处理逻辑了.都在代码里,所以这里就主要是贴资源吧. 这个自定义view就一个类,源码如下: package com.cc.library.view; import android.

iOS开发——笔记篇&amp;关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结

关于字典plist读取/字典转模型/自定义View/MVC/Xib的使用/MJExtension使用总结 一:Plist读取 1 /******************************************************************************/ 2 一:简单plist读取 3 4 1:定义一个数组用来保存读取出来的plist数据 5 @property (nonatomic, strong) NSArray *shops; 6 7 2:使用懒加载的方

自定义View之实现日出日落太阳动效

以前也很羡慕网上大神随手写写就是一个很漂亮的自定义控件,所以我下决心也要学着去写,刚好最近复习了Android View的绘制流程知识,看来看去就是那些个知识点,没点产出总感觉很迷.现在个人呢用的是华为荣耀8手机,碰巧在看自带的天气APP时,滑到最下面看到那个动效图:日出时间和日落时间上边是一个半圆,白天任意的时刻(在日出和日落时间之间)都有对应一个太阳从日出时刻沿着半圆弧做动画特效,个人第一感觉就是:就拿这个来练练手啦!于是拿着笔和纸,画了模型图,甚至求什么sin.cos函数,有点过分了哈,还

Android 自定义View

最近在看鸿洋大神的博客,在看到自定义部分View部分时,想到之前案子中经常会要用到"图片 + 文字"这类控件,如下图所示: 之前的做法是在布局文件中,将一个Image & TextView组件放在LinearLayout/RelativeLayout中.今天就尝试了通过自定义View的方式来实现"图片 + 文字"组件. 首先在/res/value/目录下新建attrs.xml文件,在该文件中为CustomTextView定义以下几个attr.分别为 1.文字

Android自定义View探索(一)—生命周期

Activity代码: public class FiveActivity extends AppCompatActivity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.e("log", "Activity生命周期:onCreate"); setConte

Android自定义view之仿支付宝芝麻信用仪表盘

自定义view练习 仿支付宝芝麻信用的仪表盘 对比图: 首先是自定义一些属性,可自己再添加,挺基础的,上代码 <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="RoundIndicatorView"> <!--最大数值--> <attr name="maxNum" form

自定义view—折线图

学习导航 第一节:http://blog.csdn.net/bobo8945510/article/details/53197727 -自定义View-自定义属性及引用 第二节:http://blog.csdn.net/bobo8945510/article/details/53203233 自定义view02-图形绘制 第三节:http://blog.csdn.net/bobo8945510/article/details/53213938 自定义View-绘图基础之Path 第四节:http

Android笔记自定义View之制作表盘界面

前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了.身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章--一步步实现精美的钟表界面.正适合我这种菜鸟来学习,闲着没事,我就差不多依葫芦画瓢也写了一个自定义表盘View,现在纯粹最为笔记记录下来.先展示下效果图: 下面进入正题 自定义表盘属性 老规矩,先在attrs文件里添加表盘自定义属性 <declare-styleable name="WatchView"&

Android 创建自定义 View 的属性 (attrs) 时需要注意的问题

自定义 View 的属性并不难,可以参照官方的文档 https://developer.android.com/training/custom-views/create-view.html 但是需要注意一个问题,否则可能浪费很多时间. <resources> <declare-styleable name="AppsControllerBlock"> <attr name="letterCase" format="enum&q