zoukankan      html  css  js  c++  java
  • 5月14日学习日志

    今天学习了在指定的地方播放帧动画。

    关键代码为:

    public class FrameView extends ImageView {
    
        private AnimationDrawable anim;
    
        public FrameView(Context context) {
            super(context);
        }
    
        public FrameView(Context context, AttributeSet attrs) {
            super(context, attrs);
        }
    
        public FrameView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        public void setAnim(AnimationDrawable anim){
            this.anim = anim;
        }
    
        public void setLocation(int top,int left){
            this.setFrame(left,top,left + 200,top + 200);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            try{
                //反射调用AnimationDrawable里的mCurFrame值
                Field field = AnimationDrawable.class
                        .getDeclaredField("mCurFrame");
                field.setAccessible(true);
                int curFrame = field.getInt(anim);// 获取anim动画的当前帧
                if (curFrame == anim.getNumberOfFrames() - 1)// 如果已经到了最后一帧
                {
                    //让该View隐藏
                    setVisibility(View.INVISIBLE);
                }
            }catch (Exception e){e.printStackTrace();}
            super.onDraw(canvas);
        }
    }
    public class MainActivity extends AppCompatActivity {
    
        private FrameView fView;
        private AnimationDrawable anim = null;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            FrameLayout fly = new FrameLayout(this);
            setContentView(fly);
            fView = new FrameView(this);
            fView.setBackgroundResource(R.anim.anim_zhuan);
            fView.setVisibility(View.INVISIBLE);
            anim = (AnimationDrawable) fView.getBackground();
            fView.setAnim(anim);
            fly.addView(fView);
            fly.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    //设置按下时才产生动画效果
                    if(event.getAction() == MotionEvent.ACTION_DOWN){
                        anim.stop();
                        float x = event.getX();
                        float y = event.getY();
                        fView.setLocation((int) y - 40,(int)x-20);  //View显示的位置
                        fView.setVisibility(View.VISIBLE);
                        anim.start();    //开启动画
                    }
                    return false;
                }
            });
        }
    }
  • 相关阅读:
    C++ list<list<int> >类型的对象遍历
    Apache与Nginx服务器对比
    服务器重写技术:rewrite
    冒泡排序(python版)
    有k个list列表, 各个list列表的元素是有序的,将这k个列表元素进行排序( 基于堆排序的K路归并排序)
    堆排序(C++版)
    [转载] 单链表的相关操作
    TCP三次握手连接与四次握手断开
    [转载] TCP与UDP对比
    进程与线程的联系与区别
  • 原文地址:https://www.cnblogs.com/20193925zxt/p/14910635.html
Copyright © 2011-2022 走看看