电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android自定義View實現波浪動畫

瀏覽:47日期:2022-09-22 17:08:31

本文實例為大家分享了Android自定義View實現波浪動畫的具體代碼,供大家參考,具體內容如下

效果演示

代碼調用與實現效果

xml中調用

<developer.shivam.waveview.Wave android:layout_width='match_parent' android:layout_height='match_parent' app:amplitude='100' app:quadrant='0.5' app:speed='0.15'/>

Android自定義View實現波浪動畫

實現原理

屬性配置

attrs.xml文件中,進行屬性配置

<?xml version='1.0' encoding='utf-8'?><resources> <declare-styleable name='Wave'> <!--波浪顏色--> <attr name='waveColor' format='color'/> <!--波浪背景顏色--> <attr name='waveBackgroundColor' format='color'/> <!--波浪速度--> <attr name='speed' format='float'/> <!--正弦曲線相關--> <!--波浪振幅--> <attr name='amplitude' format='integer'/> <!--波浪相對于控件的位置--> <attr name='quadrant' format='float'/> <!--波浪的頻率--> <attr name='frequency' format='float'/> </declare-styleable></resources>

獲取屬性,同時對屬性賦默認值

final TypedArray array = context.obtainStyledAttributes(set, R.styleable.Wave); mSpeed = array.getFloat(R.styleable.Wave_speed, DEFAULT_SPEED); mWaveColor = array.getColor(R.styleable.Wave_waveColor, DEFAULT_WAVE_COLOR); mWaveBKColor = array.getColor(R.styleable.Wave_waveBackgroundColor, DEFAULT_WAVE_BK_COLOR); mAmplitude = array.getInt(R.styleable.Wave_amplitude, DEFAULT_AMPLITUDE); mQuadrant = array.getFloat(R.styleable.Wave_quadrant, DEFAULT_QUADRANT); mFrequency = array.getFloat(R.styleable.Wave_frequency, DEFAULT_FREQUENCY); array.recycle();

繪制波浪

在onDraw()中使用Canvas進行繪制即可,這里需要注意的正弦曲線的繪制.

正弦曲線(y=Asin(ωx+φ)+k)的一些參數如下:

A——振幅,當物體作軌跡符合正弦曲線的直線往復運動時,其值為行程的1/2。 (ωx+φ)——相位,反映變量y所處的狀態。 φ——初相,x=0時的相位;反映在坐標系上則為圖像的左右移動。 k——偏距,反映在坐標系上則為圖像的上移或下移。 ω——角速度, 控制正弦周期(單位角度內震動的次數)。

onDraw中的代碼:

@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); final int width = getWidth(); final int height = getHeight(); final int waveHeight = (int) (getHeight() * mQuadrant); // 繪制背景 canvas.drawColor(mWaveBKColor); mWavePath.moveTo(0, height); mWavePath.lineTo(0, waveHeight); for (int i = 1; i <= width; i++) { // 繪制正弦曲線 y = A Sin(ωt+ ρ) = A sin(2πft + ρ) final float y = (float) (waveHeight + mAmplitude * Math.sin(2 * Math.PI * i * mFrequency + mShift)); mWavePath.lineTo(i, y); } // 將曲線閉合 mWavePath.lineTo(width, height); canvas.drawPath(mWavePath, mWavePaint);}

波浪動畫

這時波浪應該已經繪制完成了,下面使用Handler中的周期任務實現動畫效果.

// 創建一個周期任務,它的職責是改變正弦曲線的偏移量 final class WaveAnimation implements Runnable { @Override public void run() { mWavePath.reset(); mShift += mSpeed; invalidate(); Wave.this.postDelayed(this, DEFAULT_PERIOD); } }

在View被創建的時候讓它進行執行

// 開始波浪動畫postDelayed(new WaveAnimation(), DEFAULT_PERIOD);

完整代碼

public class Wave extends View { // 默認屬性值 private static final int DEFAULT_AMPLITUDE = 200; private static final int DEFAULT_PERIOD = 16; private static final float DEFAULT_SPEED = .1F; private static final float DEFAULT_QUADRANT = .33F; private static final float DEFAULT_FREQUENCY = 1F / 360F; private static final int DEFAULT_WAVE_COLOR = Color.parseColor('#64B5F6'); private static final int DEFAULT_WAVE_BK_COLOR = Color.parseColor('#EEEEEE'); @SuppressWarnings('FieldCanBeLocal') @ColorInt private int mWaveColor; @ColorInt private int mWaveBKColor; // 振幅 private int mAmplitude; // 波浪位于View的位置 private float mQuadrant; // 波浪的頻率,這個值越大,波浪越密集 private float mFrequency; // 速度 private float mSpeed; private float mShift; private final Paint mWavePaint = new Paint(Paint.ANTI_ALIAS_FLAG); private final Path mWavePath = new Path(); public Wave(Context context) { this(context, null); } public Wave(Context context, AttributeSet attrs) { this(context, attrs, 0); } public Wave(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs); } private void init(Context context, AttributeSet set) { final TypedArray array = context.obtainStyledAttributes(set, R.styleable.Wave); mSpeed = array.getFloat(R.styleable.Wave_speed, DEFAULT_SPEED); mWaveColor = array.getColor(R.styleable.Wave_waveColor, DEFAULT_WAVE_COLOR); mWaveBKColor = array.getColor(R.styleable.Wave_waveBackgroundColor, DEFAULT_WAVE_BK_COLOR); mAmplitude = array.getInt(R.styleable.Wave_amplitude, DEFAULT_AMPLITUDE); mQuadrant = array.getFloat(R.styleable.Wave_quadrant, DEFAULT_QUADRANT); mFrequency = array.getFloat(R.styleable.Wave_frequency, DEFAULT_FREQUENCY); array.recycle(); mWavePaint.setStrokeWidth(2); mWavePaint.setColor(mWaveColor); // 開始波浪動畫 postDelayed(new WaveAnimation(), DEFAULT_PERIOD); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); final int width = getWidth(); final int height = getHeight(); final int waveHeight = (int) (getHeight() * mQuadrant); // 繪制背景 canvas.drawColor(mWaveBKColor); mWavePath.moveTo(0, height); mWavePath.lineTo(0, waveHeight); for (int i = 1; i <= width; i++) { // 繪制正弦曲線 y = A Sin(ωt+ ρ) = A sin(2πft + ρ) final float y = (float) (waveHeight + mAmplitude * Math.sin(2 * Math.PI * i * mFrequency + mShift)); mWavePath.lineTo(i, y); } // 將曲線閉合 mWavePath.lineTo(width, height); canvas.drawPath(mWavePath, mWavePaint); } final class WaveAnimation implements Runnable { @Override public void run() { mWavePath.reset(); mShift += mSpeed; invalidate(); Wave.this.postDelayed(this, DEFAULT_PERIOD); } }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 小型玉石雕刻机_家用玉雕机_小型万能雕刻机_凡刻雕刻机官网 | 搜木网 - 木业全产业链交易平台,免费搜货、低价买货! | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 定制/定做冲锋衣厂家/公司-订做/订制冲锋衣价格/费用-北京圣达信 | 六维力传感器_三维力传感器_二维力传感器-南京神源生智能科技有限公司 | 天命文免费算命堂_自助算命_自由算命系统_长文周易 | 玉米深加工设备|玉米加工机械|玉米加工设备|玉米深加工机械-河南成立粮油机械有限公司 | SOUNDWELL 编码器|电位器|旋转编码器|可调电位器|编码开关厂家-广东升威电子制品有限公司 | 通信天线厂家_室分八木天线_对数周期天线_天线加工厂_林创天线源头厂家 | 电子元器件呆滞料_元器件临期库存清仓尾料_尾料优选现货采购处理交易商城 | 双杰天平-国产双杰电子天平-美国双杰-常熟双杰仪器 | 济南电缆桥架|山东桥架-济南航丰实业有限公司 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 | 电磁辐射仪-电磁辐射检测仪-pm2.5检测仪-多功能射线检测仪-上海何亦仪器仪表有限公司 | 便民信息网_家电维修,家电清洗,开锁换锁,本地家政公司 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 南京精锋制刀有限公司-纵剪机刀片_滚剪机刀片_合金刀片厂家 | 立式硫化罐-劳保用品硫化罐-厂家直销-山东鑫泰鑫硫化罐厂家 | 橡胶膜片,夹布膜片,橡胶隔膜密封,泵阀设备密封膜片-衡水汉丰橡塑科技公司网站 | 金属清洗剂,防锈油,切削液,磨削液-青岛朗力防锈材料有限公司 | cnc精密加工_数控机械加工_非标平键定制生产厂家_扬州沃佳机械有限公司 | 北京乾茂兴业科技发展有限公司| 二手回收公司_销毁处理公司_设备回收公司-找回收信息网 | 精密钢管,冷拔精密无缝钢管,精密钢管厂,精密钢管制造厂家,精密钢管生产厂家,山东精密钢管厂家 | 玉米深加工设备-玉米深加工机械-新型玉米工机械生产厂家-河南粮院机械制造有限公司 | 广西绿桂涂料--承接隔热涂料、隔音涂料、真石漆、多彩仿石漆等涂料工程双包施工 | 塑木弯曲试验机_铜带拉伸强度试验机_拉压力测试台-倾技百科 | 硅胶制品-硅橡胶制品-东莞硅胶制品厂家-广东帝博科技有限公司 | 江苏南京多语种翻译-专业翻译公司报价-正规商务翻译机构-南京华彦翻译服务有限公司 | 手板_手板模型制作_cnc手板加工厂-东莞天泓 | 北京西风东韵品牌与包装设计公司,创造视觉销售力! | 广州云仓代发-昊哥云仓专业电商仓储托管外包代发货服务 | 超声波焊接机_超音波熔接机_超声波塑焊机十大品牌_塑料超声波焊接设备厂家 | 全自动烧卖机厂家_饺子机_烧麦机价格_小笼汤包机_宁波江北阜欣食品机械有限公司 | 淄博不锈钢无缝管,淄博不锈钢管-鑫门物资有限公司 | 苏州防水公司_厂房屋面外墙防水_地下室卫生间防水堵漏-苏州伊诺尔防水工程有限公司 | Magnescale探规,Magnescale磁栅尺,Magnescale传感器,Magnescale测厚仪,Mitutoyo光栅尺,笔式位移传感器-苏州连达精密量仪有限公司 | 免费B2B信息推广发布平台 - 推发网| 井式炉-台车式回火炉-丹阳市电炉厂有限公司 |