码迷,mamicode.com
首页 > 其他好文 > 详细

12.新特性

时间:2015-10-26 22:38:31      阅读:354      评论:0      收藏:0      [点我收藏+]

标签:

帧动画FrameAnimation

  • 多张图片快速切换,形成动画效果
  • 帧动画使用xml定义

补间动画

  • 组件由原始状态向终极状态转变时,为了让过渡更自然,而自动生成的动画

    位移动画

    TranslateAnimation ta = new TranslateAnimation(10, 100, 20, 200);
  • 10:表示的x坐标起始位置

    • iv的真实x + 10
  • 100:表示x坐标的结束位置

    • iv的真实x + 100
  • 20:表示y坐标的起始位置

    • iv的真实y + 20
  • 200:表示y坐标的结束位置

    • iv的真实y + 200

      TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 1, Animation.RELATIVE_TO_SELF, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2);
  • Animation.RELATIVE_TO_SELF, 1:x坐标的初始位置

    • iv的真实x + 1 * iv宽
  • Animation.RELATIVE_TO_SELF, 0.5f:y坐标的起始位置

    • iv的真实y + 0.5 * iv高

缩放动画

ScaleAnimation sa = new ScaleAnimation(0.5f, 2, 0.1f, 3, iv.getWidth() / 2, iv.getHeight() / 2);
  • 0.5f:表示x坐标缩放的初始位置
    • 0.5 * iv宽
  • 2:表示x坐标缩放的结束位置
    • 2 * iv宽
  • iv.getWidth() / 2:表示缩放点的x坐标

    • iv的真实x + iv.getWidth() / 2

      ScaleAnimation sa = new ScaleAnimation(0.5f, 2, 0.1f, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
  • Animation.RELATIVE_TO_SELF, 0.5f:表示缩放点的x坐标
    • iv的真实x + 0.5 * iv宽

透明动画

AlphaAnimation aa = new AlphaAnimation(0, 0.5f);
  • 0表示动画的起始透明度
  • 0.5f表示动画的结束透明度

Fragment

  • 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容
  • 生命周期方法跟Activity一致,可以理解把其为就是一个Activity,与Activity同存亡,Activity的XX方法调用,Fragment的XX方法就调用
  • fragment切换时旧fragment对象会销毁,新的fragment对象会被创建
动态加载碎片
使用步骤:
1.定义mainActivity布局:
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. xmlns:tools="http://schemas.android.com/tools"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. tools:context=".MainActivity"
  6. android:orientation="horizontal"
  7. >
  8. <FrameLayout
  9. android:id="@+id/fl"
  10. android:layout_weight="1"//写成1,就不会把后面的顶出去了
  11. android:layout_width="0dp"
  12. android:layout_height="match_parent"
  13. ></FrameLayout>
  14. <LinearLayout
  15. android:layout_width="wrap_content"
  16. android:layout_height="match_parent"
  17. android:orientation="vertical"
  18. >
  19. <Button
  20. android:layout_width="wrap_content"
  21. android:layout_height="wrap_content"
  22. android:text="fragment01"
  23. android:onClick="click1"
  24. />
  25. <Button
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:text="fragment02"
  29. android:onClick="click2"
  30. />
  31. <Button
  32. android:layout_width="wrap_content"
  33. android:layout_height="wrap_content"
  34. android:text="fragment03"
  35. android:onClick="click3"
  36. />
  37. </LinearLayout>
  38. </LinearLayout>
2.定义Fragment的布局
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical"
  5. android:background="#ff0000"
  6. >
  7. <TextView
  8. android:layout_width="wrap_content"
  9. android:layout_height="wrap_content"
  10. android:text="热情的红色"
  11. android:textSize="20sp"
  12. />
  13. </LinearLayout>
3.Fragment代码,要继承Fragment,然后加载到主activity上,其他界面类似
  1. public class Fragment01 extends Fragment{
  2. //返回的view对象会作为fragment01的内容显示在屏幕上
  3. @Override
  4. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  5. Bundle savedInstanceState) {
  6. // TODO Auto-generated method stub
  7. View v = inflater.inflate(R.layout.fragment01, null);
  8. return v;
  9. }
  10. }
4.主activity,把逻辑写到oncreat方法里,一启动程序就是这个Fragment
  1. public class MainActivity extends Activity {
  2. private Fragment03 fg3;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. fg3 = new Fragment03();
  8. //获取fragment管理器
  9. FragmentManager fm = getFragmentManager();
  10. //打开事务
  11. FragmentTransaction ft = fm.beginTransaction();
  12. //把内容显示至帧布局
  13. ft.replace(R.id.fl, fg3);
  14. //提交
  15. ft.commit();
  16. }
  17. public void click1(View v){
  18. //把fragment01的界面显示至帧布局中
  19. //创建fragment对象
  20. Fragment01 fg1 = new Fragment01();
  21. //获取fragment管理器
  22. FragmentManager fm = getFragmentManager();
  23. //打开事务
  24. FragmentTransaction ft = fm.beginTransaction();
  25. //把内容显示至帧布局
  26. ft.replace(R.id.fl, fg1);
  27. //提交
  28. ft.commit();
  29. }
书上是这样写的
  1. <FrameLayout
  2. android:id="@+id/right_layout"
  3. android:layout_width="0dp"
  4. android:layout_height="match_parent"
  5. android:layout_weight="1" >
  6. <fragment
  7. android:id="@+id/right_fragment"
  8. android:name="com.example.fragmenttest.RightFragment"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent" />
  11. </FrameLayout>
然后:transaction.replace(R.id.right_layout, fragment);替换了这个fragment。
普通加载的话先把一个类继承fragment,然后在布局中这样name:就可以显示了
  • 低版本兼容

  • 在support-v4.jar包(4,最低兼容版本4的手机)中有相关api,也就是说fragment可以在低版本模拟器运行
  • 其他代码类似,不过在MainActivity 中需要继承FragmentActivity ,通过getSupportFragmentManager获取管理器
  1. public class MainActivity extends FragmentActivity {


  2. private Fragment03 fg3;
  3. @Override
  4. protected void onCreate(Bundle savedInstanceState) {
  5. super.onCreate(savedInstanceState);
  6. setContentView(R.layout.activity_main);
  7. fg3 = new Fragment03();
  8. //获取fragment管理器
  9. FragmentManager fm = getSupportFragmentManager();
  10. //打开事务
  11. FragmentTransaction ft = fm.beginTransaction();
  12. //把内容显示至帧布局
  13. ft.replace(R.id.fl, fg3);
  14. //提交
  15. ft.commit();
  16. }

传递数据

1.活动传递给Fragment03
活动
  1. public void click4(View v){
  2. String text = et_main.getText().toString();
  3. //传递数据
  4. fg3.setText(text);
  5. }
  6. public void setText(String text){
  7. et_main.setText(text);
  8. }
Fragment03
  1. //返回的view对象会作为fragment03的内容显示在屏幕上
  2. @Override
  3. public View onCreateView(LayoutInflater inflater, ViewGroup container,
  4. Bundle savedInstanceState) {
  5. // TODO Auto-generated method stub
  6. View v = inflater.inflate(R.layout.fragment03, null);
  7. tv = (TextView) v.findViewById(R.id.tv);
  8. return v;
  9. }
  10. public void setText(String text){
  11. tv.setText(text);
  12. }

2.fragment数据传递给活动,直接getActivity就可以调用活动里的方法了
  1. final EditText et = (EditText) v.findViewById(R.id.et);
  2. Button bt = (Button) v.findViewById(R.id.bt);
  3. bt.setOnClickListener(new OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. String text = et.getText().toString();
  7. //把数据传递给activity
  8. ((MainActivity)getActivity()).setText(text);
  9. }
  10. });
3.其他方法:
  • 为了方便碎片和活动之间进行通信, FragmentManager提供了一个类似于findViewById()的方法,专门用于从布局文件中获取碎片的实例,前提是自己在布局文件中定义fragment这个标签,了代码如下所示:
  1. RightFragment rightFragment = (RightFragment) getFragmentManager()
  2. .findFragmentById(R.id.right_fragment);
调用 FragmentManager的 findFragmentById()方法,可以在活动中得到相应碎片的实例,然后就能轻松地调用碎片里的方法了。
  • 掌握了如何在活动中调用碎片里的方法, 那在碎片中又该怎样调用活动里的方法呢?其实这就更简单了,在每个碎片中都可以通过调用 getActivity()方法来得到和当前碎片相关联的活动实例,代码如下所示:
  1. MainActivity activity = (MainActivity) getActivity();
有了活动实例之后,在碎片中调用活动里的方法就变得轻而易举了。另外当碎片中需要使用 Context对象时, 也可以使用 getActivity()方法, 因为获取到的活动本身就是一个 Context对象了。
  • 这时不知道你心中会不会产生一个疑问,既然碎片和活动之间的通信问题已经解决了,那么碎片和碎片之间可不可以进行通信呢?说实在的,这个问题并没有看上去的复杂,它的基本思路非常简单,首先在一个碎片中可以得到与它相关联的活动,然后再通过这个活动去获取另外一个碎片的实例,这样也就实现了不同碎片之间的通信功能,因此这里我们的答案是肯定的。



在碎片中模拟返回栈
通过点击按钮添加了一个碎片之后,这时按下 Back键程序就会直接退出。如果这里我们想模仿类似于返回栈的效果,按下 Back键可以回到上一个碎片。这里需要在事务提交之前调用了 FragmentTransaction的 addToBackStack()方法,它可以接收一个名字用于描述返回栈的状态,一般传入 null即可。现在重新运行程序,并点击按钮将 AnotherRightFragment添加到活动中,然后按下 Back键,你会发现程序并没有退出,而是回到了 RightFragment界面,再次按下 Back键程序才会退出。
  1. AnotherRightFragment fragment = new AnotherRightFragment();
  2. FragmentManager fragmentManager = getFragmentManager();
  3. FragmentTransaction transaction = fragmentManager.
  4. beginTransaction();
  5. transaction.replace(R.id.right_layout, fragment);
  6. transaction.addToBackStack(null);
  7. transaction.commit();
技术分享



动画

帧动画

一张张图片不断的切换,形成动画效果

  • 在drawable目录下定义xml文件,子节点为animation-list,在这里定义要显示的图片和每张图片的显示时长

    <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false">
    <item android:drawable="@drawable/g1" android:duration="200" />
    <item android:drawable="@drawable/g2" android:duration="200" />
    <item android:drawable="@drawable/g3" android:duration="200" />
    </animation-list>
  • 在屏幕上播放帧动画

    ImageView iv = (ImageView) findViewById(R.id.iv);
    //把动画文件设置为imageView的背景
    iv.setBackgroundResource(R.drawable.animations);
    AnimationDrawable ad = (AnimationDrawable) iv.getBackground();
    //播放动画
    ad.start();

补间动画

  • 原形态变成新形态时为了过渡变形过程,生成的动画就叫补间动画
  • 位移、旋转、缩放、透明
    位移:
  • 参数10指的是X的起点坐标,但不是指屏幕x坐标为10的位置,而是imageview的 真实X + 10
  • 参数150指的是X的终点坐标,它的值是imageview的 真实X + 150

    //创建为位移动画对象,设置动画的初始位置和结束位置
    TranslateAnimation ta = new TranslateAnimation(10, 150, 20, 140);
  • x坐标的起点位置,如果相对于自己,传0.5f,那么起点坐标就是 真实X + 0.5 * iv宽度
  • x坐标的终点位置,如果传入2,那么终点坐标就是 真实X + 2 * iv的宽度
  • y坐标的起点位置,如果传入0.5f,那么起点坐标就是 真实Y + 0.5 * iv高度
  • y坐标的终点位置,如果传入2,那么终点坐标就是 真实Y + 2 * iv高度

    TranslateAnimation ta = new TranslateAnimation(Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 2);
  • 动画播放相关的设置

    //设置动画持续时间
    ta.setDuration(2000);
    //动画重复播放的次数
    ta.setRepeatCount(1);
    //动画重复播放的模式
    ta.setRepeatMode(Animation.REVERSE);
    //动画播放完毕后,组件停留在动画结束的位置上
    ta.setFillAfter(true);
    //播放动画
    iv.startAnimation(ta);
    缩放:
  • 参数0.1f表示动画的起始宽度是真实宽度的0.1倍
  • 参数4表示动画的结束宽度是真实宽度的4倍
  • 缩放的中心点在iv左上角

    ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4);
  • 参数0.1f和4意义与上面相同
  • 改变缩放的中心点:传入的两个0.5f,类型都是相对于自己,这两个参数改变了缩放的中心点
  • 中心点x坐标 = 真实X + 0.5 * iv宽度
  • 中心点Y坐标 = 真实Y + 0.5 * iv高度

    ScaleAnimation sa = new ScaleAnimation(0.1f, 4, 0.1f, 4, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

    透明:
  • 0为完全透明,1为完全不透明

    AlphaAnimation aa = new AlphaAnimation(0, 0.5f);
旋转:
  • 20表示动画开始时的iv的角度
  • 360表示动画结束时iv的角度
  • 默认旋转的圆心在iv左上角

    RotateAnimation ra = new RotateAnimation(20, 360);
  • 20,360的意义和上面一样
  • 指定圆心坐标,相对于自己,值传入0.5,那么圆心的x坐标:真实X + iv宽度 * 0.5
  • 圆心的Y坐标:真实Y + iv高度 * 0.5

    RotateAnimation ra = new RotateAnimation(20, 360, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
    所有动画一起飞
    //创建动画集合
    AnimationSet set = new AnimationSet(false);
    //往集合中添加动画
    set.addAnimation(aa);
    set.addAnimation(sa);
    set.addAnimation(ra);
    iv.startAnimation(set);

属性动画

  • 补间动画,只是一个动画效果,组件其实还在原来的位置上,xy没有改变

    位移:

  • 第一个参数target指定要显示动画的组件
  • 第二个参数propertyName指定要改变组件的哪个属性
  • 第三个参数values是可变参数,就是赋予属性的新的值
  • 传入0,代表x起始坐标:当前x + 0
  • 传入100,代表x终点坐标:当前x + 100

    //具有get、set方法的成员变量就称为属性
    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 100) ;

缩放:

  • 第三个参数指定缩放的比例
  • 0.1是从原本高度的十分之一开始
  • 2是到原本高度的2倍结束

    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "scaleY", 0.1f, 2);

    透明:

  • 透明度,0是完全透明,1是完全不透明

    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "alpha", 0.1f, 1);

    旋转

  • rotation指定是顺时针旋转
  • 20是起始角度
  • 270是结束角度

    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotation", 20, 270);
  • 属性指定为rotationX是竖直翻转
  • 属性指定为rotationY是水平翻转

    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "rotationY", 20, 180);

可变参数

  • 第三个参数可变参数可以传入多个参数,可以实现往回位移(旋转、缩放、透明)

    ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 70, 30, 100) ;

所有动画一起飞

//创建动画师集合
AnimatorSet set = new AnimatorSet();
//设置要播放动画的组件
set.setTarget(bt);
//所有动画有先后顺序的播放
//set.playSequentially(oa, oa2, oa3, oa4);
//所有动画一起播放
set.playTogether(oa, oa2, oa3, oa4);
set.start();




12.新特性

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4912566.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!