Android自定義控件實(shí)現(xiàn)水波紋效果
本文實(shí)例為大家分享了Android自定義控件實(shí)現(xiàn)水波紋的具體代碼,供大家參考,具體內(nèi)容如下
示例代碼:
MainActivity.java
package com.example.mhy.shuibowen; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
activity_main.xml
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.example.mhy.shuibowen.MainActivity"> <com.example.mhy.shuibowen.MyRingWave android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
MyRingWave.java
package com.example.mhy.shuibowen; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import java.util.ArrayList; /** * 水波紋效果 * Created by mhy on 2016/6/16. */ public class MyRingWave extends View { /** * 二個(gè)相臨波浪中心點(diǎn)的最小距離 */ private static final int DIS_SOLP = 13; protected boolean isRunning = false; private ArrayList<Wave> wList; public MyRingWave(Context context,AttributeSet attrs) { super(context, attrs); wList = new ArrayList<MyRingWave.Wave>(); } @Override protected void onDraw(Canvas canvas) { for(int i=0; i<wList.size(); i++) { Wave wave = wList.get(i); canvas.drawCircle(wave.cx, wave.cy, wave.r, wave.p); } } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); switch(event.getAction()) { case MotionEvent.ACTION_DOWN: case MotionEvent.ACTION_MOVE: int x = (int) event.getX(); int y = (int) event.getY(); addPoint(x, y); break; default: break; } return true; } private Handler handler = new Handler(){ public void handleMessage(android.os.Message msg) { //刷新數(shù)據(jù) flushData(); //刷新頁(yè)面 invalidate(); //循環(huán)動(dòng)畫 if (isRunning) { handler.sendEmptyMessageDelayed(0, 50); } } }; /** * 刷新數(shù)據(jù) */ private void flushData() { for (int i = 0; i < wList.size(); i++) { Wave w = wList.get(i); //如果透明度為 0 從集合中刪除 int alpha = w.p.getAlpha(); if(alpha == 0){ wList.remove(i); //刪除i 以后,i的值應(yīng)該再減1 否則會(huì)漏掉一個(gè)對(duì)象,不過(guò),在此處影響不大,效果上看不出來(lái)。 continue; } alpha-=5; if(alpha<5){ alpha =0; } //降低透明度 w.p.setAlpha(alpha); //擴(kuò)大半徑 w.r = w.r+3; //設(shè)置半徑厚度 w.p.setStrokeWidth(w.r/3); } /* * 如果集合被清空,就停止刷新動(dòng)畫 */ if(wList.size() == 0){ isRunning = false; } } /** * 添加新的波浪中心點(diǎn) * @param x * @param y */ private void addPoint(int x, int y) { if(wList.size() == 0) { addPoint2List(x, y); isRunning = true; handler.sendEmptyMessage(0); }else{ Wave w = wList.get(wList.size()-1); if(Math.abs(w.cx - x)>DIS_SOLP || Math.abs(w.cy-y)>DIS_SOLP){ addPoint2List(x,y); } }; } /** * 添加新的波浪 * @param x * @param y */ private void addPoint2List(int x, int y) { Wave w = new Wave(); w.cx = x; w.cy=y; Paint pa=new Paint(); pa.setColor(colors[(int)(Math.random()*4)]); pa.setAntiAlias(true); pa.setStyle(Paint.Style.STROKE); w.p = pa; wList.add(w); } private int [] colors = new int[]{Color.BLUE,Color.RED,Color.YELLOW,Color.GREEN}; private class Wave { //圓心 int cx; int cy; //畫筆 Paint p; //半徑 int r; } }
MyRing.java
package com.example.mhy.shuibowen; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; /** * Created by mhy on 2016/6/16. */ public class MyRing extends View { /** * 圓心的X坐標(biāo) */ private float cx; /** * 圓心的Y坐標(biāo) */ private float cy; /** * 圓環(huán)半徑 */ private float radius = 0; /** * 默認(rèn)畫筆 */ private Paint paint; private boolean isRuning = false; public MyRing(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { radius = 0; paint = new Paint(); paint.setAntiAlias(true); paint.setStyle(Paint.Style.STROKE); // 空心圓 paint.setStrokeWidth(radius / 4); // 畫筆寬度 半徑4分之一 paint.setColor(Color.GREEN); // 畫筆顏色 paint.setAlpha(255); //不透明 } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { if(changed) { cx = getWidth() / 2; cy = getHeight() / 2; } } @Override protected void onDraw(Canvas canvas) { canvas.drawCircle(cx, cy, radius, paint); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); isRuning = false; } @Override public boolean onTouchEvent(MotionEvent event) { super.onTouchEvent(event); if(event.getAction() == MotionEvent.ACTION_DOWN) { cx = event.getX(); cy = event.getY(); initView(); startAnim(); } return true; } private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { // 設(shè)置透明度 int alpha = paint.getAlpha(); if(alpha == 0) { isRuning = false; } // 透明度 慢慢變透明 alpha = Math.max(0, alpha-10); paint.setAlpha(alpha); System.out.println(alpha); // 設(shè)置半徑 radius += 5; paint.setStrokeWidth(radius / 3); invalidate(); if(isRuning) { handler.sendEmptyMessageDelayed(0, 50); } } }; private void startAnim() { isRuning = true; handler.sendEmptyMessageDelayed(0, 50); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Android實(shí)現(xiàn)水波紋擴(kuò)散效果
- Android實(shí)現(xiàn)水波紋特效
- Android水波紋載入控件CircleWaterWaveView使用詳解
- android自定義WaveView水波紋控件
- Android中Item實(shí)現(xiàn)點(diǎn)擊水波紋效果
- Android實(shí)現(xiàn)點(diǎn)擊Button產(chǎn)生水波紋效果
- Android特效之水波紋的實(shí)現(xiàn)
- Android項(xiàng)目實(shí)戰(zhàn)手把手教你畫圓形水波紋loadingview
- Android仿水波紋流量球進(jìn)度條控制器
- Android 5.0 實(shí)現(xiàn)水波擴(kuò)散效果
相關(guān)文章
Flutter 插件url_launcher簡(jiǎn)介
最近項(xiàng)目需求是打開(kāi)一個(gè)連接跳轉(zhuǎn)到安卓或蘋果默認(rèn)的瀏覽器。雖然開(kāi)始一個(gè)簡(jiǎn)單的要求,其中的一個(gè)細(xì)節(jié)就是執(zhí)行打開(kāi)網(wǎng)頁(yè)這一操作后,不能看上去像在應(yīng)用內(nèi)部打開(kāi),看上去要在應(yīng)用外部打開(kāi),今天小編給大家介紹Flutter 插件url_launcher的相關(guān)知識(shí),感興趣的朋友一起看看吧2020-04-04一文理解Android系統(tǒng)中強(qiáng)指針的實(shí)現(xiàn)
因?yàn)锳ndroid中很多地方代碼是用C++編寫,為了能夠保證C++中指針能夠被正確的釋放,于是Android引入了其實(shí)在C++中已經(jīng)有的智能指針技術(shù)2021-10-10Android Compose實(shí)現(xiàn)伸縮ToolBar的思路詳解
這篇文章主要介紹了Android Compose之伸縮ToolBar的實(shí)現(xiàn),本文給大家分享主要實(shí)現(xiàn)思路及實(shí)現(xiàn)過(guò)程,通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Android中findViewById獲取控件返回為空問(wèn)題怎么解決
這篇文章主要介紹了Android中findViewById獲取控件返回為空問(wèn)題怎么解決的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-06-06Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面效果
這篇文章主要介紹了Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面效果,需要的朋友可以參考下2017-05-05Android開(kāi)發(fā)技巧之我的菜單我做主(自定義菜單)
Android SDK本身提供了一種默認(rèn)創(chuàng)建菜單的機(jī)制,雖然功能上還不錯(cuò),但是界面的美觀度不是很理想,本結(jié)介紹一種實(shí)現(xiàn)方法:就是通過(guò)onKeyDown事件方法和PopupWindow實(shí)現(xiàn)自定義的菜單,感興趣的朋友可以了解下2013-01-01Android音頻可視化開(kāi)發(fā)案例說(shuō)明
最近移植Android,當(dāng)Android能夠在設(shè)備上面運(yùn)行之后,首先想到的是讓音頻設(shè)備跑起來(lái)?!皼](méi)有聲音,再好的戲也出不來(lái)”接下來(lái)介紹Android音頻可視化開(kāi)發(fā)流程2012-12-12