实现多米音乐中浮动窗口的效果
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();
}
}
}
}
效果为: