android动画如何实现一张图片从左到右的显示出来

不是从左边平移到右边的效果 就是图片位置不动 慢慢显示出来
图片不动,但是从左往右渐渐显示
左边显示,右边透明,透明部分渐渐变少的效果 求大神指点啊 要怎么做?用什么方法?

代码:
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));
    }
    }

    /**

    • 获取某个View的正确的位置
    • @param view
    • @return */ public static RectF getViewRect(View view){ int vLeft, vTop; int location[] = new int[2]; view.getLocationInWindow(location); vLeft = location[0]; vTop = location[1]; RectF mViewRect = new RectF(vLeft, vTop, vLeft + view.getWidth(), vTop + view.getHeight()); return mViewRect; }

    @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();
    }
    }

    /**

    • 设置一些信息
    • 图片显示默认是fitCenter样式的 */ public void setInformation(){ float w = mCurBitmap.getWidth(); float h = mCurBitmap.getHeight(); float viewW = mRectF.width(); float viewH = mRectF.height(); mBitmapRect.set(0, 0, (int)w, (int)h); if(w / h > viewW / viewH){//顶着宽 float curH = h * viewW / w; mDrawableRectF.set(0, (viewH - curH) / 2, viewW, (viewH - curH) / 2 + curH); } else{//顶高 float curW = w * viewH / h; mDrawableRectF.set((viewW - curW) / 2, 0, (viewW - curW) / 2 + curW, viewH); } beginAnimation(DEFAULT_ANIMATION_DURATION); }

    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();
}