本文實(shí)例為大家分享了Android自定義View的實(shí)現(xiàn)水波紋,供大家參考,具體內(nèi)容如下
目前創(chuàng)新互聯(lián)公司已為成百上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器托管、企業(yè)網(wǎng)站設(shè)計、淮南網(wǎng)站維護(hù)等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
一、實(shí)現(xiàn)效果
MainActivity.xml
<?xml version="1.0" encoding="utf-8"?>
MainActivity中的點(diǎn)擊事件
public class MainActivity extends AppCompatActivity { private Button button; private Button button2; private DiffuseView diffuseView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = findViewById(R.id.button); button2 = findViewById(R.id.button2); diffuseView = findViewById(R.id.diffuseView); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diffuseView.start(); } }); button2.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diffuseView.stop(); } }); } }
自定義view類
public class DiffuseView extends View { /** 擴(kuò)散圓圈顏色 */ private int mColor = getResources().getColor(R.color.colorAccent); /** 圓圈中心顏色 */ private int mCoreColor = getResources().getColor(R.color.colorPrimary); /** 中心圓半徑 */ private float mCoreRadius = 150; /** 擴(kuò)散圓寬度 */ private int mDiffuseWidth = 3; /** 最大寬度 */ private Integer mMaxWidth = 255; /** 擴(kuò)散速度 */ private int mDiffuseSpeed = 5; /** 是否正在擴(kuò)散中 */ private boolean mIsDiffuse = false; // 透明度集合 private ListmAlphas = new ArrayList<>(); // 擴(kuò)散圓半徑集合 private List mWidths = new ArrayList<>(); private Paint mPaint; public DiffuseView(Context context) { this(context, null); } public DiffuseView(Context context, AttributeSet attrs) { this(context, attrs, -1); } public DiffuseView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DiffuseView, defStyleAttr, 0); mColor = a.getColor(R.styleable.DiffuseView_diffuse_color, mColor); mCoreColor = a.getColor(R.styleable.DiffuseView_diffuse_coreColor, mCoreColor); mCoreRadius = a.getFloat(R.styleable.DiffuseView_diffuse_coreRadius, mCoreRadius); mDiffuseWidth = a.getInt(R.styleable.DiffuseView_diffuse_width, mDiffuseWidth); mMaxWidth = a.getInt(R.styleable.DiffuseView_diffuse_maxWidth, mMaxWidth); mDiffuseSpeed = a.getInt(R.styleable.DiffuseView_diffuse_speed, mDiffuseSpeed); a.recycle(); } private void init() { mPaint = new Paint(); mPaint.setAntiAlias(true); mAlphas.add(255); mWidths.add(0); } @Override public void invalidate() { if(hasWindowFocus()){ super.invalidate(); } } @Override public void onWindowFocusChanged(boolean hasWindowFocus) { super.onWindowFocusChanged(hasWindowFocus); if(hasWindowFocus){ invalidate(); } } @Override public void onDraw(Canvas canvas) { // 繪制擴(kuò)散圓 mPaint.setColor(mColor); for (int i = 0; i < mAlphas.size(); i ++) { // 設(shè)置透明度 Integer alpha = mAlphas.get(i); mPaint.setAlpha(alpha); // 繪制擴(kuò)散圓 Integer width = mWidths.get(i); canvas.drawCircle(getWidth() / 2, getHeight() / 2, mCoreRadius + width, mPaint); if(alpha > 0 && width < mMaxWidth){ mAlphas.set(i, alpha - mDiffuseSpeed > 0 ? alpha - mDiffuseSpeed : 1); mWidths.set(i, width + mDiffuseSpeed); } } // 判斷當(dāng)擴(kuò)散圓擴(kuò)散到指定寬度時添加新擴(kuò)散圓 if (mWidths.get(mWidths.size() - 1) >= mMaxWidth / mDiffuseWidth) { mAlphas.add(255); mWidths.add(0); } // 超過10個擴(kuò)散圓,刪除最外層 if(mWidths.size() >= 10){ mWidths.remove(0); mAlphas.remove(0); } // 繪制中心圓 mPaint.setAlpha(255); mPaint.setColor(mCoreColor); canvas.drawCircle(getWidth() / 2, getHeight() / 2, mCoreRadius, mPaint); if(mIsDiffuse){ invalidate(); } } /** * 開始擴(kuò)散 */ public void start() { mIsDiffuse = true; invalidate(); } /** * 停止擴(kuò)散 */ public void stop() { mIsDiffuse = false; mWidths.clear(); mAlphas.clear(); mAlphas.add(255); mWidths.add(0); invalidate(); } /** * 是否擴(kuò)散中 */ public boolean isDiffuse(){ return mIsDiffuse; } /** * 設(shè)置擴(kuò)散圓顏色 */ public void setColor(int colorId){ mColor = colorId; } /** * 設(shè)置中心圓顏色 */ public void setCoreColor(int colorId){ mCoreColor = colorId; } /** * 設(shè)置中心圓半徑 */ public void setCoreRadius(int radius){ mCoreRadius = radius; } /** * 設(shè)置擴(kuò)散圓寬度(值越小寬度越大) */ public void setDiffuseWidth(int width){ mDiffuseWidth = width; } /** * 設(shè)置最大寬度 */ public void setMaxWidth(int maxWidth){ mMaxWidth = maxWidth; } /** * 設(shè)置擴(kuò)散速度,值越大速度越快 */ public void setDiffuseSpeed(int speed){ mDiffuseSpeed = speed; } }
自己添加的attrs.xml(創(chuàng)建在Values包底下,切勿倒錯)
<?xml version="1.0" encoding="utf-8"?>
這樣就搞定了。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。