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 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出