使用fragment 浮动的显示内容

实现多米音乐中浮动窗口的效果

public class MainActivity extends Activity {
    
    //保存屏幕窗口的宽度和高度
    public static int wwidth,wheight;
    
    FragmentTransaction ft;
    
    FragmentManager fm;

    @SuppressWarnings("deprecation")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        wwidth=getWindowManager().getDefaultDisplay().getWidth();
        wheight=getWindowManager().getDefaultDisplay().getHeight();
        
        setContentView(R.layout.activity_main);
        
        fm=getFragmentManager();
        ft=fm.beginTransaction();
        ft.add(R.id.main_fragment, new FragmentTwo());
        ft.addToBackStack("two");//增加当前Fragment到堆栈中
        ft.commit();
    }
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        switch(keyCode){
        case KeyEvent.KEYCODE_BACK:
            int count=fm.getBackStackEntryCount();
            //菜单回退时检查堆栈中的大小,如果为1,那么直接关闭Activity,否在会出现空白界面
            if(count==1){
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);//父方法必须调用
    }

}

activity_main.xml文件内容

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.eple.fragmenttest.MainActivity" >
    

    <FrameLayout android:id="@+id/main_fragment"
       android:layout_width="match_parent"
       android:layout_height="0dp"
       android:layout_weight="1"
       android:background="#fff"
       android:alpha="1"
       />
    
    <include layout="@layout/app"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_weight="0"
        android:layout_gravity="bottom"/>
   
</LinearLayout>

主界面效果为

在FragmentTwo.java文件中只是给上图中的按键添加点击事件

public void onClick(View v) {
        switch (v.getId()) {
        case R.id.button_two:
            one=new FragmentOne();
            FragmentTransaction ft = fm.beginTransaction();
            ft.add(R.id.main_fragment,one);
            ft.addToBackStack("one");//增加到堆栈中
            //设置动画效果
//            ft.setCustomAnimations(android.R.animator.fade_in,
//                        android.R.animator.fade_out);
            //动画, 浅深效果
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
            ft.commit();
            break;
        }
    }

其中主要的Fragment类FragmentOne.java,其中主要代码都加了注释。



public class FragmentOne extends Fragment implements OnClickListener,
        OnTouchListener {

    /**
     * 填充fragment视图
     */
    View view;
    FragmentManager fm;
    FrameLayout.LayoutParams params;
    // 滚动异步任务栈
    ScrollTask scroll;
    // 手指按下时x的位置
    float downX = 0;
    // 手指提取时x位置
    float upX = 0;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {
        view = inflater.inflate(R.layout.fragment_one, container, false);
        init();
        return view;
    }

    /** 初始化 */
    private void init() {
        params = (android.widget.FrameLayout.LayoutParams) view
                .getLayoutParams();
        // 必须设置宽高参数
        params.width = MainActivity.wwidth;
        params.height = MainActivity.wheight;
        view.setLayoutParams(params);
        // 给界面设置触摸事件,用来处理屏幕移动
        view.setOnTouchListener(this);

        fm = getActivity().getFragmentManager();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        }
    }

    @SuppressLint("ClickableViewAccessibility")
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:
            downX = event.getX();
            break;
        case MotionEvent.ACTION_MOVE:
            float move = event.getX();
            float x = move - downX;
            int margin = params.leftMargin;
            margin = margin + (int) x;
            if (margin < -MainActivity.wwidth) {
                margin = -MainActivity.wwidth;
            } else if (margin > MainActivity.wwidth) {
                margin = MainActivity.wwidth;
            }
            // 滑动,稍微
            params.leftMargin = margin;
            view.setLayoutParams(params);// 设置滚动距离
            break;
        case MotionEvent.ACTION_UP:
            upX = event.getX();// 手指提起时的位置
            scroll = new ScrollTask();// 异步任务栈,用来处理提起后屏幕该怎么移动
            scroll.execute();// 执行异步任务

            break;
        }
        return true;
    }

    /**
     * 异步任务栈,用来处理手离开界面后界面的移动
     *
     * @author Administrator
     *
     */
    class ScrollTask extends AsyncTask<Void, Integer, Void> {
        // 屏幕移动单元长度
        int step = 20;
        // 睡眠事件
        int sleep = 20;

        @Override
        protected Void doInBackground(Void... params) {
            int leftMargin = FragmentOne.this.params.leftMargin;
            if (leftMargin > (-MainActivity.wwidth / 4)
                    && leftMargin < (MainActivity.wwidth / 4)) {
                // 当界面左边的距离移动的距离为小于屏幕的1/4的绝对值大小时,界面恢复原样,也可以设置为其他状态下
                if (leftMargin < 0) {
                    while (true) {
                        leftMargin = leftMargin + step;
                        if (leftMargin > 0) {
                            leftMargin = 0;
                            publishProgress(leftMargin);
                            break;
                        }
                        publishProgress(leftMargin);
                        try {
                            Thread.sleep(sleep);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                } else {
                    while (true) {
                        leftMargin = leftMargin - step;
                        if (leftMargin < 0) {
                            leftMargin = 0;
                            publishProgress(leftMargin);
                            break;
                        }
                        publishProgress(leftMargin);
                        try {
                            Thread.sleep(sleep);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            } else if (leftMargin <= (-MainActivity.wwidth / 4)) {
                // 当界面的左边小于屏幕的1/4的相反数时,向左滚动并关闭界面,
                // 关闭界面的通知,删除栈中的顶部Fragment
                while (true) {
                    leftMargin = leftMargin - step;
                    if (leftMargin < -MainActivity.wwidth) {
                        leftMargin = -MainActivity.wwidth;
                        publishProgress(leftMargin);
                        break;
                    }
                    // 发布进度
                    publishProgress(leftMargin);
                    try {// 睡眠20毫秒
                        Thread.sleep(sleep);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            } else {
                // 其他情况下, 界面向右边关闭
                while (true) {
                    leftMargin = leftMargin + step;
                    if (leftMargin > MainActivity.wwidth) {
                        leftMargin = MainActivity.wwidth;
                        publishProgress(leftMargin);
                        break;
                    }
                    publishProgress(leftMargin);
                    try {
                        Thread.sleep(sleep);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

            }
            return null;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            params.leftMargin = values[0];
            view.setLayoutParams(params);
            if (params.leftMargin == MainActivity.wwidth
                    || params.leftMargin == -MainActivity.wwidth) {
                // 应该删除掉Fragment
                // 删除栈顶元素
                fm.popBackStack();
                FragmentTransaction ft = fm.beginTransaction();
                ft.remove(FragmentOne.this);
                // ft.hide(FragmentOne.this);
                // System.out.println("隐藏掉了one");
                System.out.println("删除掉了FragmentOne");
                ft.commit();
            }
        }

    }
}


效果为:





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值