Android實現先橫向橫線展現在縱向拉開圖片

來源:互聯網
上載者:User

標籤:

前段時間產品那邊讓我做一個動畫,要求是先以橫線的方式橫向展開,在縱向展示圖片,最後展示幾秒動畫在原路返回,隨後我在網上尋找資料,發現這方面的記錄很少,最後自己寫了一個

後期還會慢慢改進;

轉載請說明出處:http://www.cnblogs.com/hyylog/p/5659619.html

步驟:1、先利用控制項的ondraw()方法,結合數字上升的動畫,實現劃線的步驟;

        2、利用postInvalidate()方法,調用dispatchDraw()方法來展示圖片的展現

 

具體代碼如下:

public class ExpandView extends LinearLayout {

private Bitmap mBitmap;
private int linearDuration = 500;
private int expandDuration = 800;
private int dismissDuration = 1500;
private Paint mpPaint;
private Paint bitPaint;
private int resultLinear = 40; // 劃線動畫執行距離完成啟動下一個動畫的距離 (為防止動畫啟動延遲產生的卡頓)
private int resultBitMap = 30; // 畫圖動畫距離啟動下次動畫的距離 (為防止動畫啟動延遲產生的卡頓)
private int type = 1; // 1 為展開動畫 2 為回縮動畫
private ValueAnimator valueAnimator = null;
private ValueAnimator valueAnimator2 = null;
private int radus = 8;
private int velua = 0;
private int veluaLinear = 0;
private View view;
private boolean isStart = false; // 保證動畫只啟動一次
private Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
velua = 0;
invalidate();
break;
case 1:
start(2);
break;
default:
break;
}
};
};

public ExpandView(Context context, AttributeSet attrs) {
super(context, attrs);
inite();
}

public void setView(View view) {
this.view = view;
}

public ExpandView(Context context) {
super(context);
inite();
}

public void inite() {
bitPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mpPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mpPaint.setStrokeWidth(5);
mpPaint.setColor(Color.BLACK);
}

public void setRadus(int radus) {
this.radus = radus;
}

public void setDistance(int linear, int bit) {
resultBitMap = bit;
resultLinear = linear;
}

public void setDuration(int linearDuration, int expandDuration,
int dismissDuration) {
this.linearDuration = linearDuration;
this.expandDuration = expandDuration;
this.dismissDuration = dismissDuration;
}

public void setLinearPaintColor(int color) {
mpPaint.setColor(color);
}

public void start(int type) {
this.type = type;
valueAnimator.cancel();
valueAnimator2.cancel();
handler.removeMessages(1);
handler.sendEmptyMessage(0);
isStart = true;
if (type == 1) {
valueAnimator.start();
} else if (type == 2) {
valueAnimator2.start();
}
}

public void initedAnimation() {
clearAnimations();
mBitmap = getBitmap();
Log.i("", "pppp====veluaLinear=>>"+(mBitmap.getWidth() - radus * 2));
valueAnimator = ValueAnimator.ofInt(0, mBitmap.getWidth() - radus * 2);
valueAnimator2 = ValueAnimator.ofInt(0, mBitmap.getHeight());
valueAnimator.setDuration(linearDuration);
valueAnimator2.setDuration(expandDuration);
valueAnimator.addUpdateListener(new AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator animation) {
veluaLinear = (Integer) animation.getAnimatedValue();
if (veluaLinear > (mBitmap.getWidth() - resultLinear)&& type == 1) {
if (isStart) {
valueAnimator2.start();
isStart = false;
}
}
postInvalidate();
}
});

valueAnimator2.addUpdateListener(new AnimatorUpdateListener() {

@Override
public void onAnimationUpdate(ValueAnimator animation) {
velua = (Integer) animation.getAnimatedValue();
postInvalidate();
veluaLinear = 0;
}
});
}

@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
if (mBitmap != null) {
Rect src;
Rect des;
if (type == 1) {
canvas.drawLine(mBitmap.getWidth() - radus, 0,mBitmap.getWidth() - radus - veluaLinear, 0,mpPaint);
src = new Rect(0, 0, mBitmap.getWidth(), velua);
des = new Rect(0, 0, mBitmap.getWidth(), velua);
} else {
canvas.drawLine(mBitmap.getWidth() - radus, 0, radus+ veluaLinear, 0, mpPaint);
src = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()- velua);
des = new Rect(0, 0, mBitmap.getWidth(), mBitmap.getHeight()- velua);
}
canvas.drawBitmap(mBitmap, src, des, bitPaint);
if (velua == mBitmap.getHeight() && type == 1) {
handler.removeMessages(1);
handler.sendEmptyMessageDelayed(1, dismissDuration);
}
if (type == 2 && velua >= mBitmap.getHeight() - resultBitMap) {
if (isStart) {
valueAnimator.start();
isStart = false;
}
}
}
}

public void clearAnimations() {
if (valueAnimator != null)
valueAnimator.cancel();
if (valueAnimator2 != null)
valueAnimator.cancel();
handler.removeMessages(1);
veluaLinear=0;
handler.sendEmptyMessage(0);
if (mBitmap != null && !mBitmap.isRecycled()) {
mBitmap.recycle();
}

}

private Bitmap getBitmap() {
// 開啟映像緩衝
view.setDrawingCacheEnabled(true);
// 必須調用measure和layout方法才能成功儲存可視組件的到png影像檔
// 測量View大小
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
// 發送位置和尺寸到View及其所有的子View
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
Bitmap bitmap = view.getDrawingCache();
android.widget.FrameLayout.LayoutParams params = (android.widget.FrameLayout.LayoutParams) getLayoutParams();
params.width=bitmap.getWidth();
params.height=bitmap.getHeight();
setLayoutParams(params);
return bitmap;
}
}

Android實現先橫向橫線展現在縱向拉開圖片

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.