想必做安卓的小伙伴都知道饭冬,在一個(gè)項(xiàng)目中或多或少的會(huì)使用到自定義view渺尘,因?yàn)樵蚣苁冀K滿(mǎn)足不了UI-UE的需求带到,入不了他們的法眼。下面簡(jiǎn)單寫(xiě)一個(gè)自定義view旨别。以水波紋效果為例
需求是寫(xiě)一個(gè)水波紋的效果诗赌,類(lèi)似于pc上的點(diǎn)擊效果。
需求分析:點(diǎn)擊效果剖析:圓(實(shí)心秸弛、空心都可)+透明度越來(lái)越低+半徑越來(lái)越大
理清需求以后就很好實(shí)現(xiàn)了铭若,下面上代碼:
/**
* 半徑越來(lái)越大--圓環(huán)鋸齒等于半徑的1/3----透明度越來(lái)越低
* Created by Administrator on 2017/12/25.
*/
public class WaterView extends View{
private Paint paint;
private float x = 0;
private float y = 0;
private float radio=30;
private float stroke=20;
private int alpha=255;
public WaterView(Context context) {
super(context);
}
public WaterView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initPaint();
}
private void initPaint(){
paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(Color.RED);
paint.setStyle(Paint.Style.FILL);
paint.setStrokeWidth(radio/3);
paint.setAlpha(alpha);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (x==0 && y==0){
return;
}
canvas.drawCircle(x,y,radio,paint);//參數(shù):坐標(biāo)+半徑
}
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
initPaint();
alpha=alpha-20;//透明度降低
radio=radio+10;//半徑增大
if (alpha <= 20){
alpha=0;
paint.setAlpha(alpha);
}else {
sendEmptyMessageDelayed(0,40);
}
invalidate();//強(qiáng)制重繪
}
};
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
radio=30;
stroke=20;
alpha=255;
x = event.getX();
y = event.getY();
//利用handler機(jī)制,設(shè)置畫(huà)筆屬性胆屿,在很短的時(shí)間內(nèi)重新繪制奥喻,達(dá)到波紋效果
handler.sendEmptyMessage(0);
break;
}
return true;
}
}
XML中直接引用即可
<com.example.administrator.mycustomview.MyView
android:layout_width="match_parent"
android:layout_height="match_parent" />
另外一些背景的點(diǎn)擊效果也可以使用這種自定義偶宫,像cardview等一些做的比較好的控件都自帶了點(diǎn)擊的水波紋效果非迹。代碼邏輯很清晰。