首页
网站首页
公司简介
资讯中心
推荐内容
返回顶部
自定义控件,Android开发常用的Utils
发布时间:2020-03-16 20:47
浏览次数:

是因为view是复用的,所以设置某些item分化于任何item的习性的时候要成对的管理,什么看头呢

Android开拓中日常会用到的util工具类,那是为了能让我们编辑项目代码是节约无尽岁月。在每一种常用的类中。

  1. 绘图:滑块 + 背景
  2. 自定义属性:isOpen - 构造或代码调整开关
  3. 动作:触摸滑动开关,点击开关
  4. 监听:OnToggleChangeListener - 开关状态退换监听器

先上效果图

比方你设置了某些条件下有个别view不可以预知,那么肯定要设置对峙条件的view可以知道,不然由于view是复用的,上叁回设置了不可知,下个条件还未设置回可以预知,那么它仍然不可以见到的

图片 1图1图片 2图2

  • 拷贝滑块和背景到能源目录
  • 自定义控件世袭 View

图片 3screenshot.gif

再举例你设置了某些条件下有个别item是一种颜色,那么早晚要设置对峙条件的view为另叁个种颜色,不然由于view是复用的,上三次设置了有些item是一种颜色,下个原则还未安装回原本的颜料,就拜见到不菲任何的item仍好玩的事情未发生前安装的颜色

下载地址:MyAndroidUtils工具类

自定义参数

  • 新建attrs.xml,定义参数isOpen,类型boolean
<resources> <declare-styleable name="CustomToggleButton"> <attr name="isOpen" format="boolean"/> </declare-styleable></resources>
  • 结构方法中取得参数isOpen的开始值
TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CustomToggleButton);isOpen = typedArray.getBoolean(R.styleable.CustomToggleButton_isOpen, false);typedArray.recycle();

WaveView的属性

图片 4WaveView的属性

  • Wate Level - 波浪静止时水面间距尾部的万丈
  • Amplitude - 波浪垂直振动时间距水面包车型大巴最大间隔
  • Wave Length - 三个一体化的浪花的品位长度
  • Wave Shift - 波浪相对于领头地点的程度偏移

切切实实也足以仿照效法那篇小说 http://blog.csdn.net/huanongjingchao/article/details/42918869

加载数据

  • 取得滑块和背景的Bitmap
background = BitmapFactory.decodeResource(getResources(), R.drawable.ctb_switch_background);button = BitmapFactory.decodeResource(getResources(), R.drawable.ctb_slide_button);

达成思路

虚构大家有二个画好波形的图纸,那么大家只需求用那张图纸填充(X轴方向重复,Y轴方向延伸)整个View,然后水平位移图片,就足以取得波浪效果了。

由此要做的事很简短:绘制三个波形图,填充到View里,移动波形图。

1. 制图初叶波形

private void createShader() { ... Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas; // Draw default waves into the bitmap // y=Asin+h float waveX1 = 0; final float wave2Shift = mDefaultWaveLength / 4; final float endX = getWidth(); final float endY = getHeight(); ... while (waveX1 < endX) { double wx = waveX1 * mDefaultAngularFrequency; int startY =  (mDefaultWaterLevel + mDefaultAmplitude * Math.sin; // draw bottom wave with the alpha 40 canvas.drawLine(waveX1, startY, waveX1, endY, wavePaint1); // draw top wave with the alpha 60 float waveX2 = (waveX1 + wave2Shift) % endX; canvas.drawLine(waveX2, startY, waveX2, endY, wavePaint2); waveX1++; } // use the bitamp to create the shader mWaveShader = new BitmapShader(bitmap, Shader.TileMode.REPEAT, Shader.TileMode.CLAMP); mViewPaint.setShader(mWaveShader);}

先是多个长度宽度恰等于WaveView的Bitmap:Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888)

在Bitmap中使用默许的习性绘制出初叶波形。起初波形的习性:Wate Level为WaveView高度的四分之二;Amplitude为WaveView中度的四分之一0;Wave Length等于WaveView的肥瘦。

制图好的上马波形是下边这一个样子:

图片 5始发波形

代码第 9 ~ 27 行实行初始波形的绘图。波形由wave1和wave2三个波组成,wave2便是wave1向左偏移1/4的wave length,所以无需再行总括。

最终把这几个Bitmap设置成为Paint的Shader。设置Shader相当于设定画笔的造型,使用安装了Shader的Paint绘制图形时,实际上是在选用Bitmap填充绘制的区域。X轴的填写形式为TileMode.REPEAT,即重复填充;Y轴的填充情势为TileMode.CLAMP,即利用边缘的色值延伸填充。

2. 调度Bitmap的高低并填充到WaveView

有了始于波先生形,当WaveView的质量改换时,只需求对起来波形实行对应的拉伸/压缩和位移就足以获得顾客想要的波浪。

// sacle shader according to mWaveLengthRatio and mAmplitudeRatio// this decides the size(mWaveLengthRatio for width, mAmplitudeRatio for height) of wavesmShaderMatrix.setScale( mWaveLengthRatio / DEFAULT_WAVE_LENGTH_RATIO, mAmplitudeRatio / DEFAULT_AMPLITUDE_RATIO, 0, mDefaultWaterLevel);// translate shader according to mWaveShiftRatio and mWaterLevelRatio this decides the start position(mWaveShiftRatio for x, mWaterLevelRatio for // this decides the start position(mWaveShiftRatio for x, mWaterLevelRatio for y) of wavesmShaderMatrix.postTranslate( mWaveShiftRatio * getWidth(), (DEFAULT_WATER_LEVEL_RATIO - mWaterLevelRatio) * getHeight;// assign matrix to invalidate the shadermWaveShader.setLocalMatrix(mShaderMatrix);float radius = getWidth() / 2f - (mBorderPaint == null ? 0f : mBorderPaint.getStrokeWidth;canvas.drawCircle(getWidth() / 2f, getHeight() / 2f, radius, mViewPaint);

代码 3 ~ 6 行对Shader进行拉伸/压缩,10 ~ 12 行对Shader进行水平/竖直平移。

代码 17 ~ 19 行用Shader填充成想要的样子。

3. 动画

// horizontal animation.// wave waves infinitely.ObjectAnimator waveShiftAnim = ObjectAnimator.ofFloat( mWaveView, "waveShiftRatio", 0f, 1f);waveShiftAnim.setRepeatCount(ValueAnimator.INFINITE);waveShiftAnim.setDuration;waveShiftAnim.setInterpolator(new LinearInterpolator;animators.add(waveShiftAnim);// vertical animation.// water level increases from 0 to center of WaveViewObjectAnimator waterLevelAnim = ObjectAnimator.ofFloat( mWaveView, "waterLevelRatio", 0f, 0.5f);waterLevelAnim.setDuration;waterLevelAnim.setInterpolator(new DecelerateInterpolator;animators.add(waterLevelAnim);// amplitude animation.// wave grows big then grows small, repeatedlyObjectAnimator amplitudeAnim = ObjectAnimator.ofFloat( mWaveView, "amplitudeRatio", 0f, 0.05f);amplitudeAnim.setRepeatCount(ValueAnimator.INFINITE);amplitudeAnim.setRepeatMode(ValueAnimator.REVERSE);amplitudeAnim.setDuration;amplitudeAnim.setInterpolator(new LinearInterpolator;animators.add(amplitudeAnim);

代码 3 ~ 8 行让波形从来向右移动,效果正是波形平昔在多事。

代码 12 ~ 16 行让水位从0慢慢涨到WaveView中度的二分之一。

代码 20 ~ 26 行波浪的高低从大变小,再从小变大。

代码在github:WaveView

美团平台及酒旅工作群令人啦,应接加入大家!作者得以辅助内推,简历请发到笔者邮箱gelitenight@gmail.com

高端Android开垦程序员事行业内部容: 负担美团客栈、旅游付加物 Android 客商端的思考、开辟与改正。

  1. 3年以上海工业作涉世,2年以上Android开辟涉世;
  2. 深谙Android系统,熟习Android软件的支付、测量试验、分发流程;
  3. 白玉无瑕的编制程序风格,扎实的编程根底和数据布局算法根底;
  4. 熟习移动网络的特点,对网络编制程序和常用互联网合同有较深入明白和资历;
  5. 有一定的结构划虚构计技巧,优秀的编码工夫,编写文书档案技能;
  6. 青睐互连网和新技术,具有极强的连忙学习本领;
  7. 有以下特征优先思量:
    • 有开源文章或技能博客;
    • 熟悉Socket编程。

北京市、法国首都、罗安达、圣Jose皆有岗位,更加多岗位请见职位列表。

本文据守“具名-非商业性利用-相符形式分享”的编写协同切磋,应接转发,转发时请注解作者和出处。我: gelitenight出处: http://gelitenight.github.io/wave-view/

友情链接: 网站地图
Copyright © 2015-2019 http://www.nflfreepicks.net. 新葡萄京娱乐场网址有限公司 版权所有