qq_36588653 2017-11-28 09:24 采纳率: 0%
浏览 3772
已结题

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

不是位移动画,想要那种从一条边隐藏的,慢慢的展示出来完整的图片,类似从一条边拉伸出来,请大神贴上完整代码谢谢

  • 写回答

14条回答 默认 最新

  • 魔武 2017-11-29 03:41
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器