Android属性动画ObjectAnimator如何封装成一个通用类

83229324 发布于 2016/08/31 14:40
阅读 499
收藏 0
import android.animation.ObjectAnimator;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.Toast;

import com.example.administrator.twodemo.R;

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * Created by Administrator on 2016/8/25 0025.
 */
public class AnimationImageView extends ImageView {
    public List<ImageView> get_ivList() {
        return _ivList;
    }
    public void set_ivList(List<ImageView> _ivList) {
        this._ivList = _ivList;
    }
    private List<ImageView> _ivList = new ArrayList<>();
    int width, height;
    FrameLayout demoView;
    //定时任务
    private ScheduledExecutorService scheduledExecutorService;
    int _count = 0;
    /**
     * 定时器倒计时
     * handler这个地方需要重新制作,
     */
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (_count < 21) {
                loadValueAnimation(_count);
                Log.d("yang", _count + "");
            }

        }
    };

    /**
     * 执行轮播图切换任务
     *
     * @author caizhiming
     */
    private class SlideShowTask implements Runnable {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            if (_count < 21) {
                handler.obtainMessage().sendToTarget();
            }
            _count++;
        }
    }

    /**
     * 开始轮播图切换
     */
    private void startPlay() {
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        //1,4设置的是时间
        scheduledExecutorService.scheduleAtFixedRate(new SlideShowTask(), 1, 4, TimeUnit.SECONDS);
    }

    public AnimationImageView(final Context context, List<ImageView> list, FrameLayout _fl) {
        super(context);
        WindowManager wm = (WindowManager) getContext()
                .getSystemService(Context.WINDOW_SERVICE);
        width = wm.getDefaultDisplay().getWidth();
        height = wm.getDefaultDisplay().getHeight();

        demoView = new FrameLayout(context);
        demoView.setBackgroundResource(R.color.white_tran);

        for (int i = 0; i < list.size(); i++) {
            ImageView iv = new ImageView(context);
            iv.setImageResource(R.mipmap.fly_button);
            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(dip2px(context, 65), dip2px(context, 65));

            int tmp = (int) (Math.random() * width);
            if (tmp > dip2px(context, 65)) {
                tmp -= dip2px(context, 65);
            }
            //负数的原因是因为要从顶部往下跑,并不显示顶部的红包
            params.setMargins(tmp, 0, 0, 0);
            demoView.addView(iv, params);
            _ivList.add(iv);
            /**
             * 按钮点击效果
             */
            final int finalI = i;
            _ivList.get(i).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Toast.makeText(context, "这是点击的第" + finalI + "个", Toast.LENGTH_SHORT).show();
                }
            });
        }
        _fl.addView(demoView);
        startPlay();

    }


    /**
     * 动画效果加载
     *
     * @param what
     */
    private void loadValueAnimation(int what) {
        Log.d("yang",what+" 动画效果");
        ObjectAnimator animator = ObjectAnimator.ofFloat(_ivList.get(what), "iv", 5000 + 100);
        animator.setInterpolator(new AccelerateInterpolator());
        animator.start();


    }

    /**
     * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
     */
    public int dip2px(Context context, float dpValue) {
        final float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }

}
//┏┓   ┏┓
// ┏┛┻━━━┛┻┓
//┃       ┃  
//┃   ━   ┃
//┃ ┳┛ ┗┳ ┃
//┃       ┃
//┃   ┻   ┃
//┃       ┃
//┗━┓   ┏━┛
//┃   ┃  神兽保佑        
//┃   ┃  代码无BUG!
//┃   ┗━━━┓
//┃       ┣┓
//┃       ┏┛
//┗┓┓┏━┳┓┏┛
// ┃┫┫ ┃┫┫

// ┗┻┛ ┗┻┛

要实现的效果,从外部传入list(里面记录了一些红包参数)这儿我让list装的是ImageView为了demo。在Activity中实例化这个类之后就直接让这个类在自己内部进行创建list.size()的红包对象,然后让这些东西下来,但是现在遇到的问题是,这些东西创建好了,就是下不来。。。。_count的值也会变,就是属性动画不动。。。不知道什么原因。

我这样写了,定时器可以进行倒计时,但是ObjectAnimator并不在界面上执行,这是为什么呢?好奇怪。。。大神们是怎么封装一个通用类的呢?




加载中
返回顶部
顶部