「已注销」 2016-06-06 05:21 采纳率: 0%
浏览 5920
已采纳

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

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

  • 写回答

4条回答 默认 最新

  • Kelley_cfy 2016-06-06 07:42
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥50 永磁型步进电机PID算法
  • ¥15 sqlite 附加(attach database)加密数据库时,返回26是什么原因呢?
  • ¥88 找成都本地经验丰富懂小程序开发的技术大咖
  • ¥15 如何处理复杂数据表格的除法运算
  • ¥15 如何用stc8h1k08的片子做485数据透传的功能?(关键词-串口)
  • ¥15 有兄弟姐妹会用word插图功能制作类似citespace的图片吗?
  • ¥200 uniapp长期运行卡死问题解决
  • ¥15 latex怎么处理论文引理引用参考文献
  • ¥15 请教:如何用postman调用本地虚拟机区块链接上的合约?
  • ¥15 为什么使用javacv转封装rtsp为rtmp时出现如下问题:[h264 @ 000000004faf7500]no frame?