嗯。。再差1篇就可以獲得持之以恒徽章了,今天帶大家畫一個比較簡單的view。
轉載請注明出處:http://blog.csdn.net/wingichoy/article/details/50477108
廢話不多說,看效果圖:

首先 構造函數 測量... 這里就一筆帶過了。?
~~~
public ErrorView(Context context) {
this(context, null);
}
public ErrorView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ErrorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY) {
mWidth = widthSize;
} else {
mWidth = 200;
}
if (heightMode == MeasureSpec.EXACTLY) {
mHeight = heightSize;
} else {
mHeight = 200;
}
setMeasuredDimension(mWidth, mHeight);
}
~~~
如果你看不懂上面這些,翻翻我的這一篇博客,有一些補充的知識點。[圓形百分比view](http://blog.csdn.net/wingichoy/article/details/50334595)
接下來draw,如果讓你繪制一個靜態的這個突然,你一定閉著眼也能畫出來。。那么怎么才能實現動態的效果呢。。
其實就是模仿手繪的過程,我們是一點一點畫出來的,一條線的逐漸延遲。 ?那我們就來模仿這個自然的過程。
首先畫一個圓形。
~~~
Paint p = new Paint();
p.setStrokeWidth(10);
p.setAntiAlias(true);
p.setColor(Color.RED);
p.setStyle(Paint.Style.STROKE);
RectF rectF = new RectF(0 + 10, 0 + 10, mWidth - 10, mHeight - 10);
canvas.drawArc(rectF, 180, 360 * mProgress / 100, false, p);
mProgress+=5;
~~~
可以看到drawArc的第三個參數 是變化的 , 其中mProgress的初值是零,這里讓他自增,也就是說,每次調用onDraw方法,他就會增加。所以每次的弧都會比原來長一點點,直到最后畫完。 ?所以在程序的最后 一定有?postInvalidateDelayed(10); 方法。
接下來來繪制兩條線,這里的坐標我直接取半徑的4分之一啦,唯一注意一點就是,只有在progress大于100的時候 我們才繪制兩條線,兩條線段也是根據一個變量自增的,原理同上。 ?這里mLineOneX等參數均表示畫線的時候兩點的坐標。 當mLineOneX = mWidth * 0.5的時候 ?mWidth /4 + mLineOneX 就等于我們要畫線段的最終點。

~~~
if (mProgress > 100) {
//畫左邊的線
if (mLineOneX < mWidth * 0.5) {
mLineOneX+=20;
mLineOneY+=20;
}
canvas.drawLine(mWidth / 4, mHeight / 4, mWidth / 4 + mLineOneX, mHeight / 4 + mLineOneY, p);
if (mLineOneX == mWidth * 0.5) {
if (mLineTwoX < mWidth * 0.5) {
mLineTwoX+=20;
mLineTwoY+=20;
}else {
//判斷全部繪制完成
isLineDrawDone = true;
}
canvas.drawLine(mWidth / 4, (float) (mHeight * 0.75), mWidth / 4 + mLineTwoX, (float) (mHeight * 0.75) - mLineTwoY, p);
}
}
~~~
之后 添加一個標記位 ? isLineDrawDone ?判斷一下 如果沒有畫完 則 :
~~~
if(isLineDrawDone){
Log.e("wing","draw done");
}else{
postInvalidateDelayed(10);
}
~~~
現在 基本上完成了繪制, ?別急 還沒加震動,震動效果是怎么實現的呢,大家還記得嗎,如果忘了,可以看看我這篇博客:[自定義動畫 實現抖一抖效果](http://blog.csdn.net/wingichoy/article/details/47122619)
所以我們要寫一個接口,來回調onStop
~~~
public interface OnStopListener{
void onStop(View v);
}
~~~
把最后的繪制完成完善,繼續增加一個標志位,代表全部繪制完成
~~~
if(isLineDrawDone){
Log.e("wing","draw done");
if(!isDrawDone) {
if (mOnStopListener != null) {
mOnStopListener.onStop(this);
}
isDrawDone = true;
}
}else{
postInvalidateDelayed(10);
}
~~~
提供一個reset()方法 讓用戶可以手動控制重繪
~~~
public void reset() {
mProgress = 0;
mLineOneX = 0;
mLineOneY = 0;
mLineTwoX = 0;
mLineTwoY = 0;
isLineDrawDone = false;
isDrawDone = false;
invalidate();
}
~~~
在提供一個添加監聽器的方法
~~~
public void setOnStopListener(OnStopListener onStopListener){
mOnStopListener = onStopListener;
}
~~~
最后 在Activity中 為這個View添加 震動效果
~~~
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mErrorView = (ErrorView) findViewById(R.id.errorView);
mErrorView.setOnStopListener(new ErrorView.OnStopListener() {
@Override
public void onStop(View v) {
ShakeAnimation sa = new ShakeAnimation();
sa.setDuration(1000);
v.startAnimation(sa);
}
});
mErrorView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mErrorView.reset();
}
});
~~~
嘿嘿嘿。。。這樣就騙到了持之以恒勛章。
源碼地址:http://download.csdn.net/detail/wingichoy/9394685
- 前言
- android自定義viewgroup初步之一----抽屜菜單
- Android 自定義view --圓形百分比(進度條)
- Android 自定義View -- 簡約的折線圖
- 新手自定義view練習實例之(一) 泡泡彈窗
- 新手自定義view練習實例之(二) 波浪view
- 手把手帶你畫一個 時尚儀表盤 Android 自定義View
- 手把手帶你畫一個動態錯誤提示 Android自定義view
- 手把手帶你做一個超炫酷loading成功動畫view Android自定義view
- 關于Android自定義view 你所需要知道的基本函數
- Android自定義view進階-- 神奇的貝塞爾曲線
- wing帶你玩轉自定義view系列(1) 仿360內存清理效果
- wing帶你玩轉自定義view系列(2) 簡單模仿qq未讀消息去除效果
- wing帶你玩轉自定義view系列(3)模仿微信下拉眼睛
- 手把手教你畫一個 逼格滿滿圓形水波紋loadingview Android
- 有坑?? 為何wing墜入PorterDuffXferMode的萬丈深淵(PorterDuffXferMode深入試驗)
- 手把手帶你畫一個漂亮蜂窩view Android自定義view
- 一個炫字都不夠??!!!手把手帶你打造3D自定義view
- 恭喜發財! -- 手把手教你仿造一個qq下拉搶紅包 Android自定義view