不是从左边平移到右边的效果 就是图片位置不动 慢慢显示出来
图片不动,但是从左往右渐渐显示
左边显示,右边透明,透明部分渐渐变少的效果 求大神指点啊 要怎么做?用什么方法?
代码:
package com.my.ui;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
/**
Created by my
*/
public class RenderingView extends View implements View.OnClickListener{
//是否layout完成
private boolean mInit;
private Paint mPaint;
private RectF mRectF;
// 0 - 1
private float mProgress;
private Bitmap mCurBitmap;
private Rect mBitmapRect;
private RectF mDrawableRectF;
private Rect mSrc;
private RectF mDst;
private static final int DEFAULT_ANIMATION_DURATION = 1000;
private OnClickListener mClickListener;
private ObjectAnimator mAnimator;
public RenderingView(Context context) {
this(context, null);
}
public RenderingView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public RenderingView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init(){
mInit = false;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
mRectF = new RectF();
mBitmapRect = new Rect();
mDrawableRectF = new RectF();
mSrc = new Rect();
mDst = new RectF();
mProgress = 0;
mAnimator = ObjectAnimator.ofFloat(this, "progress", 1);
mAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
super.setOnClickListener(this);
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
if(changed){
doInit(getViewRect(this));
}
}
/**
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(mInit && mCurBitmap != null){
mSrc.set(mBitmapRect.left, mBitmapRect.top, (int)(mBitmapRect.right * mProgress + 0.5f), mBitmapRect.bottom);
mDst.set(mDrawableRectF.left, mDrawableRectF.top, mDrawableRectF.right * mProgress, mDrawableRectF.bottom);
canvas.drawBitmap(mCurBitmap, mSrc, mDst, mPaint);
}
}
private void doInit(RectF rectF){
if(!mInit || !mRectF.equals(rectF)){
mRectF.set(rectF);
if(mCurBitmap != null){
setInformation();
}
mInit = true;
}
}
public float getProgress() {
return mProgress;
}
public void setProgress(float progress) {
this.mProgress = progress;
invalidate();
}
public void setImageBitmap(Bitmap bitmap){
mCurBitmap = bitmap;
if (mCurBitmap != null && mInit) {
setInformation();
}
}
/**
public void beginAnimation(int duration){
setProgress(0);
mAnimator.cancel();
mAnimator.setDuration(duration).start();
}
@Override
public void setOnClickListener(OnClickListener l) {
mClickListener = l;
}
@Override
public void onClick(View v) {
beginAnimation(DEFAULT_ANIMATION_DURATION);
if(mClickListener != null){
mClickListener.onClick(v);
}
}
}
用法:
写在XML中然后,
RenderingView renderingView = (RenderingView)findViewById(R.id.renderview);
renderingView.setImageBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.test));
你看这样能否满足你的要求:
不停改变图片所在控件的宽度,从零到wrap content。
很简单, 自定义View重写onDraw方法, 然后通过Interpolator和Evaluator(或者直接用属性动画操作mProgress -- 0 - 100)生成合适的值用于绘制一个mProgress, 然后在Ondraw中根据mProgress绘制一部分图片canvas.drawBitmap(mImage, mSrc, mDst, mPaint),实际上就是控制mSrc和mDst两个矩阵来控制绘制部分
RenderingView增加onMeasure
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(mCurBitmap != null){
int w = mCurBitmap.getWidth();
int h = mCurBitmap.getHeight();
int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
if(maxWidth > w && maxHeight > h){
widthMeasureSpec = MeasureSpec.makeMeasureSpec(w, MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(h, MeasureSpec.EXACTLY);
} else{
int newWidth;
int newHeight;
if(((float)w) / h >= ((float)maxWidth) / maxHeight){//图片比较宽 view的宽不够 这时候应该顶着高
if(maxHeight >= h){//view的高比图片大
newHeight = h;
} else{
newHeight = maxHeight;
}
newWidth = (int)(w * 1.0f * newHeight / h + 0.5f);
if(newWidth > maxWidth){//保证图片显示完全
newWidth = maxWidth;
newHeight = (int)(h * 1.0f * newWidth / w + 0.5f);
}
} else{//图片比较高 view的高不够 这时候应该顶着宽
if(maxWidth >= w){//view的宽比图片大
newWidth = w;
} else{
newWidth = maxWidth;
}
newHeight = (int)(h * 1.0f * newWidth / w + 0.5f);
if(newHeight > maxHeight){//保证图片显示完全
newHeight = maxHeight;
newWidth = (int)(w * 1.0f * newHeight / h + 0.5f);
}
}
widthMeasureSpec = MeasureSpec.makeMeasureSpec(newWidth, MeasureSpec.EXACTLY);
heightMeasureSpec = MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
然后将setBitmap修改成这样:
public void setImageBitmap(Bitmap bitmap){
mCurBitmap = bitmap;
mInit = false;
requestLayout();
}