随堂笔记1及属性动画

问1:在子线程中能不能弹Toast?
解析:我们知道在子线程中弹Toast会崩掉;
但是只要加入Looper就可以了:
Looper.prepare();
  .......
  Toast.makeText(...).show();
  Handler handler=new Handler(){
  ...handleMessage(){.....}
  };
  .......
Looper.loop();
一般都是在子线程中发消息,主线程来处理;加入Looper之后,就能主发,子线程处理,或子线程发子线程处理(好像没啥意义)。
Handler发送消息和处理消息,Looper从消息队列取出消息给Handler处理。

问2:ViewPager适配数据时,什么时候 extends PagerAdapter,什么时候继承自FragmentStatePagerAdapter?
解析:①如果ViewPager中填充View时用PagerAdapter。
② 如果ViewPager中填充Fragment时,用FragmentStatePagerAdapter,它是PagerAdapter的一个子类。
创建adapter对象时需要传入FragmentManager,可以用getSupportFragmentManager() 获取,它向下兼容。
问2.1:FragmentStatePagerAdapter与FragmentPagerAdapter的区别?
解析:数据量比较小时用FragmentPagerAdapter;
数据量大时用FragmentStatePagerAdapter,它会保存Fragment的状态(推荐用这个)

问3:自定义控件要实现哪些方式?
解析:如自定义ViewGroup,需实现主要的两个方法:
 ① onMeasure:测量自己的宽和高,及测量子View的宽和高
 ② onLayout:设置子View的位置
     onMeasure:根据子View的布局文件,为子View设置测量模式和测量值。
测量=测量模式 + 测量值 ;
测量模式:3种  --->EXACTLY(很精确的):100dp, match_parent
AT_MOST(根据子View情况而定):wrap_content
UNSPCIDIED(子View想要多大就多大):很少见

问4:自定义控件时,有3个构造函数,分别什么时候调用?
public GamePintuLayout(Context context) {}
public GamePintuLayout(Context context, AttributeSet attrs) {}
public GamePintuLayout(Context context, AttributeSet attrs, int defStyleAttr) {}
解析:当new这个自定义控件,只传入context时,调用第一个;
 当在xml布局中加入这个自定义控件时,一般调用第二个;
 第三个一般系统不会调用,要在代码中显示的调用。

5.  fragment生命周期:  与Activity生命周期对应关系:
created --  >onAttach(),onCreate(),onCreateView(),onActivityCreated().
started -- > onStart();
resumed -- > onResume();
paused -- > onPause();
stopped -- > onStop();
destroyed -- > onDestroyView(),onDestroy(),onDetach().
oncreateView()   想当于 setcontentview(xml);

问6:渐变动画跟属性动画的区别?
解析:在Android 3.0中,新引入了除补间动画Tween Animation、帧动画Frame Animation以外的第三种动画,属性动画Property Animation就是ValueAnimator类.特点:ValueAnimator通过改变对象的属性值来实现界面的改变,而其他动画,只是界面显示上的改变,动画结束后,你会发现,即使view已经运动到别的位置,但click事件还是在原来的地方,ValueAnimator不会有这个问题。
ValueAnimator有两个子类,一个是TimeAnimator,一个是ObjectAnimator。
TimeAnimator在api 16才引入,它并不能直接实现动画效果,而是在TimeListener里返回动画持续的时间,与上次调用的间隔时间,要怎么改变view,需要自己操作。
ObjectAnimator可以直接改变对象的属性值,比如,我们可以通过改变ProgressBar的progress属性,实现进度的改变.
摘自: Android开发:使用ValueAnimator动画
使用方法查看鸿洋的: Android 属性动画 源码解析 深入了解其内部实现

问7:Fragment有哪些API?哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏?
解析:
1.常用的3个类:Fragment--定义Fragment ;FragmentManager --用于在Activity中操作Fragment; FragmentTransaction -- 事务,保证一些列Fragment操作的原子性
2. 获取FragmentManage
  v4中,getSupportFragmentManager
3. FragmentTransaction的方法
 ① benginTransatcion
    FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
 ② transaction.add()  往Activity中添加一个Fragment
 ③ transaction.remove() 
  从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(BackStack),这个Fragment实例将会被销毁。
 ④ transaction.replace()
  使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
 ⑤ transaction.hide()
  隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,对应的操作是:transaction.show()
 ⑥ detach()
  会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
 ⑦ attach()  重建view视图,附加到UI上并显示。
 ⑧ transatcion.commit()  //提交一个事务
比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。remove和detach有一点细微的区别,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。
详情点这: Android Fragment 真正的完全解析(上)

8. SparseArray、ContentValues、Bundle
 解析: SparseArray 是int为key,content为Object类型的Map,但是它比HashMap效率要高。
  ContentValues的key是String类型,content是基本类型(一般在数据库中使用)。
  Bundle(用于两个activity之间通讯) 也是key -value的形式。

9. 使用属性动画Animator
1) ObjectAnimator
 ① ObjectAnimator.ofFloat(imageView,"rotation",0,360F).setDuration(1000).start();
  只要有set,get方法的属性都可以操作,如translationX,X,scaleX等.
 ② 多个动画执行时,其它是个异步的过程,并不是一个执行完后再执行另外的。但Google提供了更多的方法:
 PropertyValuesHolder p1=PropertyValuesHolder.ofFloat("rotation",0,360F);
 PropertyValuesHolder p2=PropertyValuesHolder.ofFloat("translationX",0,200F);
 PropertyValuesHolder p3=PropertyValuesHolder.ofFloat("scaleX",0,2F);
 ObjectAnimator.ofPropertyValuesHolder(imageView,p1,p2,p3).setDuration(1000).start();
 这样就实现了多个动画同时执行。它的优点是进行了优化,效率更高。
 ③ 多个动画有顺序的执行
     ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"rotation",0,360F);
     ObjectAnimator anim2=ObjectAnimator.ofFloat(one,"translationX",0,200F);
     ObjectAnimator anim3=ObjectAnimator.ofFloat(one,"scaleX",0,3F);
     AnimatorSet set=new AnimatorSet();
//     set.playTogether(anim1,anim2,anim3); //同时
//     set.playSequentially(anim1,anim2,anim3); //顺序
     set.play(anim2).with(anim3);  //多组合
     set.play(anim1).after(anim2);
     set.setDuration(1000).start();
④ 动画监听
 ObjectAnimator anim1=ObjectAnimator.ofFloat(one,"alpha",0,1F);
 anim1.addListener(new AnimatorListenerAdapter(){});
 使用AnimatorListenerAdapter可以只实现其中的某些方法,若使用AnimatorListener则必须实现4个方法。
2)ValueAnimator 数值发生器
 ValueAnimator并不会操作任何属性,也不会启动任何动画,它只是给出动画该怎么变化的值。
 ObjectAnimator是ValueAnimator的子类。
① ValueAnimator 的使用
 ValueAnimator animator = ValueAnimator.ofFloat(0, 100F);  
  animator.setDuration(1000).start(); 
  animator.addUpdateListener(new AnimatorUpdateListener()  
  {  
      @Override  
      public void onAnimationUpdate(ValueAnimator animation)  
      {  
          mBlueBall.setTranslationY((Float) animation.getAnimatedValue());  
      }  
  });  
 ValueAnimator只计算出变化的值,在Listener中拿到值,由其它来操作这个值。
② TypeEvaluator 值计算器
  ValueAnimator valueAnimator = new ValueAnimator();  
  valueAnimator.setEvaluator(new TypeEvaluator<PointF>(){  
    @Override  
    public PointF evaluate(float fraction, PointF startValue,PointF endValue)  
    {  
        // x方向200px/s ,则y方向0.5 * 10 * t  
        PointF point = new PointF();  
        point.x = 200 * fraction * 3;  
        point.y = 0.5f * 200 * (fraction * 3) * (fraction * 3);  
        return point;  
    }  
  });  
  /***** 自定义了值计算器,使用了泛型PointF,自制定计算规则,fraction是0~1的计算因子
  *****/
   valueAnimator.setDuration(1000).start(); 
   valueAnimator.addUpdateListener(new AnimatorUpdateListener()  
   {  
       @Override  
       public void onAnimationUpdate(ValueAnimator animation)  
       {  
           PointF point = (PointF) animation.getAnimatedValue();  
           mBlueBall.setX(point.x);  
           mBlueBall.setY(point.y);    
       }  
   });  
10. 主题:
actionbar背景色:<item name="android:colorPrimary">
状态栏背景色:<item name="android:colorPrimaryDark">
控件颜色(光标等):<item name="android:colorAccent">






























猜你喜欢

转载自blog.csdn.net/ymangu/article/details/44629155