美文网首页
十、Fragment和View

十、Fragment和View

作者: 浮生若梦OvO | 来源:发表于2019-06-20 22:01 被阅读0次

一、Fagment入门

// 1.得到碎片管理者
FragmentManager manager = getFragmentManager();
// 2.打开数据库事务
FragmentTransaction tr = manager.beginTransaction();

// 构建碎片的对象
SaveFragment fragment = new SaveFragment();

// 替换公共的空间,显示对应的碎片
tr.replace(R.id.container, fragment);

// 提交事务
tr.commit();

注:打开事物和提交事务必须是打开一次提交一次,来满足事物的特性。

二、Fragment与Activity之间的通讯

怎样拿到Activity中EditView输入框中的数据,并在Fragment中显示,代码如下:

public class SoundFragment extends Fragment {

//使用这个方法来显示该碎片到底展示什么UI布局,有一点类似activity里面的onCreate方法
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    //让当前碎片显示sound界面
    View view = inflater.inflate(R.layout.sound, null);

    view.findViewById(R.id.btn).setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            EditText et = (EditText) getActivity().findViewById(R.id.et);
            //getActivity() 这个方法就是获取到了fragment寄存在哪一个activity上面的对象。
            Toast.makeText(getActivity(), "按钮被点击了。。"+et.getText().toString(), 0).show();

        }
    });
    return view ;
}

三、fragment的生命周期

与activity基本类似

onCreate()-->onStart()-->onResume()-->onPause()-->onStop()-->onDestroy().

一旦这个碎片被其他碎片替换显示了,那么原来的碎片将要被销毁。

四、fragment向下兼容

修改导包问题,android.app.x ----> android.support.v4.x

activity要修改继承关系, activity-----fragmentActivity

修改方法 FragmentManager manager = getSupportFragmentManager();

五、View动画

public class MainActivity extends Activity {
ImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iv = (ImageView) findViewById(R.id.iv);
}

public void translate(View v) {

    // 定义平移动画
    /*
     * TranslateAnimation anim = new TranslateAnimation( 0, 100, 0, 100);
     */

    // Animation.ABSOLUTE 指的就是后面的x或者y的数值是什么类型----绝对值像素点
    // Animation.RELATIVE_TO_SELF 相对于自己的宽高多少倍,后面的数值指的是倍数
    // Animation.RELATIVE_TO_PARENT 屏幕的宽高倍数

    TranslateAnimation anim = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0, Animation.RELATIVE_TO_PARENT,
            0.5f, Animation.RELATIVE_TO_PARENT, 0,
            Animation.RELATIVE_TO_PARENT, 0.5f);

    // 播放的次数
    anim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    anim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    anim.setDuration(2000);

    // 让这个控件播放指定的动画
    iv.startAnimation(anim);

}
//旋转动画
public void rotate(View v) {

    RotateAnimation anim = new RotateAnimation(0, 360,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);

    // 播放的次数
    anim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    anim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    anim.setDuration(2000);

    // 让这个控件播放指定的动画
    iv.startAnimation(anim);
}

public void scale(View v) {

    // 如果后面的数字比前面大,那么代表的是放大,否则是缩小
    ScaleAnimation anim = new ScaleAnimation(3, 1, 3, 1,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);

    // 播放的次数
    anim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    anim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    anim.setDuration(2000);

    // 让这个控件播放指定的动画
    iv.startAnimation(anim);

}

public void alpha(View v) {
    // 从半透明状态到不透明状态,注意: 0.0 - 1.0 区间
    AlphaAnimation anim = new AlphaAnimation(0.2f, 1.0f);
    // 播放的次数
    anim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    anim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    anim.setDuration(4000);

    // 让这个控件播放指定的动画
    iv.startAnimation(anim);
}

public void set(View v) {
    // 这是动画的集合  true -- 集合中的子动画使用的将是集合的插入器Interpolator,
    //false -- 子动画自己使用 自己的插入器Interpolator
    AnimationSet set = new AnimationSet(false);



    TranslateAnimation anim = new TranslateAnimation(
            Animation.RELATIVE_TO_PARENT, 0, 
            Animation.RELATIVE_TO_PARENT,
            0.5f, 
            Animation.RELATIVE_TO_PARENT, 0,
            Animation.RELATIVE_TO_PARENT, 0.5f);

    // 播放的次数
    anim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    anim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    anim.setDuration(2000);


    /*RotateAnimation ranim = new RotateAnimation(0, 360,
            Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF,
            0.5f);

    // 播放的次数
    ranim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    ranim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    ranim.setDuration(2000);*/


    AlphaAnimation aanim = new AlphaAnimation(0.2f, 1.0f);
    // 播放的次数
    aanim.setRepeatCount(Animation.INFINITE);
    // 播放完毕之后,倒着播放
    aanim.setRepeatMode(Animation.REVERSE);
    // 设置播放时间
    aanim.setDuration(2000);

    //把动画加入到集合中。
    set.addAnimation(anim);
    set.addAnimation(aanim);

    //让控件播放集合中的动画
    iv.startAnimation(set);



}

六、View动画在Xml中

首先要在res下面创建anim文件夹,将创建的xml文件放在其中
在xml文件中的代码:

<?xml version="1.0" encoding="utf-8"?>
<translate 
xmlns:android="http://schemas.android.com/apk/res/android"
android:fromXDelta="0"
android:toXDelta="50%p"
android:fromYDelta="0"
android:toYDelta="50%p"
android:duration="2000"
android:repeatCount="infinite"
android:repeatMode="reverse">

<!-- 
    如果写的是数字代表的是绝对值的移动 
    百分比代表的是自己的倍数。
    百分比后面跟上p,代表的是移动父元素的倍数
-->    
</translate>

在类中方的代码:

public void translate(View v) {

    Animation anim= AnimationUtils.loadAnimation(this, R.anim.translate_demo);
    iv.startAnimation(anim);


}
注:view动画中的空间的位置并没有改变,只是图片在变化,他摆放在那里,就还在那个位置。

七、属性动画

public class MainActivity extends Activity {
ImageView iv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    iv = (ImageView) findViewById(R.id.iv);


    iv.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(MainActivity.this, "红心被点击了。", 0).show();
        }
    });
}

public void translate(View v) {

    // 使用ObejctAnimator去创建属性动画
    // 参数一:让谁播放这个动画 - 让iv播放这个动画
    // 参数二:当前动画是什么类型,写上属性的名字即可。
    //参数三:移动的数值。可以是float数组或者直接是数字10,20,30...
    ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "translationX", 10,20, 100);
    anim.setDuration(2000);
    anim.setRepeatCount(ObjectAnimator.INFINITE);
    anim.setRepeatMode(ObjectAnimator.REVERSE);
    // 让属性动画播放起来
    anim.start();



}

public void rotate(View v) {
    // 使用ObejctAnimator去创建属性动画
    // 参数一:让谁播放这个动画 - 让iv播放这个动画
    // 参数二:当前动画是什么类型,写上属性的名字即可。
    ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "rotationY", 0, 360);

    anim.setDuration(2000);
    anim.setRepeatCount(ObjectAnimator.INFINITE);
    anim.setRepeatMode(ObjectAnimator.REVERSE);
    // 让属性动画播放起来
    anim.start();
}

public void scale(View v) {
    // 使用ObejctAnimator去创建属性动画
    // 参数一:让谁播放这个动画 - 让iv播放这个动画
    // 参数二:当前动画是什么类型,写上属性的名字即可。
    ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "scaleY", 1, 3);

    anim.setDuration(2000);
    anim.setRepeatCount(ObjectAnimator.INFINITE);
    anim.setRepeatMode(ObjectAnimator.REVERSE);
    // 让属性动画播放起来
    anim.start();
}

public void alpha(View v) {

    // 使用ObejctAnimator去创建属性动画
    // 参数一:让谁播放这个动画 - 让iv播放这个动画
    // 参数二:当前动画是什么类型,写上属性的名字即可。
    ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "alpha", 0.2f, 1);

    anim.setDuration(2000);
    anim.setRepeatCount(ObjectAnimator.INFINITE);
    anim.setRepeatMode(ObjectAnimator.REVERSE);
    // 让属性动画播放起来
    anim.start();
}

public void set(View v) {
    AnimatorSet set = new AnimatorSet();


    ObjectAnimator anim = ObjectAnimator.ofFloat(iv, "translationX", 10, 100);

    anim.setDuration(2000);
    /*anim.setRepeatCount(ObjectAnimator.INFINITE);
    anim.setRepeatMode(ObjectAnimator.REVERSE);*/


    ObjectAnimator anim2 = ObjectAnimator.ofFloat(iv, "translationY",10, 100);

    anim2.setDuration(2000);
/*anim2.setRepeatCount(ObjectAnimator.INFINITE);
    anim2.setRepeatMode(ObjectAnimator.REVERSE);*/

    //指定这个集合里面有几个动画  ,使用的是一起播放的设置
//set.playTogether(anim , anim2);

    //按照顺序播放 ,先播放第一个动画,然后播放第二个动画
    set.playSequentially(anim,anim2);

    //让集合动画播放起来
    set.start();
    }
}

注:属性动画中的条目的位置也发生了变化。

八、属性动画在xml中

在条目中的代码

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android" 
android:valueFrom="0"
android:valueTo="100"
android:propertyName="translationX"
android:duration="2000"
android:repeatCount="infinite"
android:repeatMode="reverse">
</objectAnimator>

在mainactivity中的代码

public void translate(View v) {

    Animator animation = AnimatorInflater.loadAnimator(this, R.animator.translatex_demo);

    //让控件去播放这个动画
    animation.setTarget(iv);

    animation.start();
}

相关文章

网友评论

      本文标题:十、Fragment和View

      本文链接:https://www.haomeiwen.com/subject/trtrqctx.html