package org.kymjs.music.ui;
import org.kymjs.kjframe.KJActivity;
import org.kymjs.kjframe.ui.KJActivityStack;
import org.kymjs.kjframe.ui.ViewInject;
import org.kymjs.music.Config;
import org.kymjs.music.R;
import org.kymjs.music.service.PlayerService;
import org.kymjs.music.ui.fragment.LyricFragment;
import org.kymjs.music.ui.fragment.MainFragment;
import org.kymjs.music.ui.widget.ResideMenu;
import org.kymjs.music.ui.widget.ResideMenuItem;
import org.kymjs.music.utils.ImageUtils;
import org.kymjs.music.utils.Player;
import android.app.Fragment;
import android.app.FragmentTransaction;
import android.content.BroadcastReceiver;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.ServiceConnection;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 应用程序主Activity
*
* @author kymjs
*/
public class Main extends KJActivity {
private ResideMenu resideMenu;
private ResideMenuItem itemDown;
private ResideMenuItem itemScan;
private ResideMenuItem itemTimer;
private ResideMenuItem itemSettings;
private ResideMenuItem itemQuit;
/** 音乐播放器服务 */
public PlayerService mPlayersService;
private final Connection conn = new Connection();
private final MusicChangeReceiver changeReceiver = new MusicChangeReceiver();
private Button mBtnNext, mBtnPrevious, mBtnPlay;
private ImageView mImg;
private TextView mTvTitle, mTvArtist;
// 歌词界面需要的变量
public boolean isOpen = false;// content当前是否为显示
public int screenHeight = 0;// lyric显示的高度
public FrameLayout.LayoutParams contentParams;// 通过此参数来更改lyric界面的位置。
public View lyricView;
public LyricFragment lyricFragment;
@Override
public void setRootView() {
setContentView(R.layout.main_activity);
}
@Override
public void initWidget() {
setUpMenu();
handleLrcView(); // 要放在lyricFragment之前调用
lyricFragment = new LyricFragment();
changeFragment(new MainFragment(), false);
changeFragment(R.id.main_layout_lyric, lyricFragment, false);
initBottonBar();
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent serviceIntent = new Intent(this, PlayerService.class);
this.bindService(serviceIntent, conn, Context.BIND_AUTO_CREATE);
}
@Override
public void registerBroadcast() {
super.registerBroadcast();
IntentFilter filter = new IntentFilter();
filter.addAction(Config.RECEIVER_MUSIC_CHANGE);
filter.addAction(Config.RECEIVER_ERROR);
registerReceiver(changeReceiver, filter);
}
@Override
protected void onResume() {
super.onResume();
refreshBottomBar();
}
/**
* 处理歌词界面显示方式
*/
private void handleLrcView() {
WindowManager window = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
screenHeight = window.getDefaultDisplay().getHeight();
int width = window.getDefaultDisplay().getWidth();
contentParams = new FrameLayout.LayoutParams(width,
FrameLayout.LayoutParams.WRAP_CONTENT);
lyricView = findViewById(R.id.main_aty_lyric);
contentParams.topMargin = screenHeight;
lyricView.setLayoutParams(contentParams);
resideMenu.addIgnoredView(lyricView);
}
/**
* 初始化侧滑菜单界面控件
*/
private void setUpMenu() {
// 附加到当前activity
resideMenu = new ResideMenu(this);
resideMenu.setBackground(R.drawable.menu_background_cool);
resideMenu.attachToActivity(this);
// 创建菜单项
itemDown = new ResideMenuItem(this, R.drawable.icon_down, "下载管理");
itemScan = new ResideMenuItem(this, R.drawable.icon_scan, "扫描音乐");
itemTimer = new ResideMenuItem(this, R.drawable.icon_timer, "定时音乐");
itemSettings = new ResideMenuItem(this, R.drawable.icon_setup, "系统设置");
itemQuit = new ResideMenuItem(this, R.drawable.icon_quit, "下次再来");
MenuClickListener listener = new MenuClickListener();
itemDown.setOnClickListener(listener);
itemScan.setOnClickListener(listener);
itemTimer.setOnClickListener(listener);
itemSettings.setOnClickListener(listener);
itemQuit.setOnClickListener(listener);
resideMenu.addMenuItem(itemScan);
resideMenu.addMenuItem(itemDown);
resideMenu.addMenuItem(itemTimer);
resideMenu.addMenuItem(itemSettings);
resideMenu.addMenuItem(itemQuit);
}
/**
* 初始化底部栏
*/
private void initBottonBar() {
findViewById(R.id.bottom_bar).setOnClickListener(this);
mImg = (ImageView) findViewById(R.id.bottom_img_image);
mImg.setBackgroundResource(R.drawable.img_noplaying);
mTvTitle = (TextView) findViewById(R.id.bottom_tv_title);
mTvArtist = (TextView) findViewById(R.id.bottom_tv_artist);
mTvTitle.setText(Config.TITLE);
mTvArtist.setText(Config.ARTIST);
mBtnNext = (Button) findViewById(R.id.bottom_btn_next);
mBtnPrevious = (Button) findViewById(R.id.bottom_btn_previous);
mBtnPlay = (Button) findViewById(R.id.bottom_btn_play);
mBtnNext.setOnClickListener(this);
mBtnPrevious.setOnClickListener(this);
mBtnPlay.setOnClickListener(this);
}
/**
* 刷新底部栏
*/
private void refreshBottomBar() {
Player player = Player.getPlayer();
switch (player.getPlaying()) {
case Config.PLAYING_PAUSE:
mImg.setImageResource(R.drawable.img_playing);
mBtnPlay.setBackgroundResource(R.drawable.selector_btn_play);
mTvTitle.setText(player.getMusic().getTitle());
mTvArtist.setText(player.getMusic().getArtist());
break;
case Config.PLAYING_PLAY:
mImg.setImageResource(R.drawable.img_playing);
mBtnPlay.setBackgroundResource(R.drawable.selector_btn_pause);
mTvTitle.setText(player.getMusic().getTitle());
mTvArtist.setText(player.getMusic().getArtist());
break;
case Config.PLAYING_STOP:
mImg.setImageResource(R.drawable.img_noplaying);
mBtnPlay.setBackgroundResource(R.drawable.selector_btn_play);
mTvTitle.setText(Config.TITLE);
mTvArtist.setText(Config.ARTIST);
break;
}
}
@Override
public void widgetClick(View v) {
Player player = Player.getPlayer();
switch (v.getId()) {
case R.id.bottom_bar:
wantScroll();
break;
case R.id.bottom_btn_next:
mPlayersService.next();
break;
case R.id.bottom_btn_previous:
mPlayersService.previous();
break;
case R.id.bottom_btn_play:
if (player.getPlaying() == Config.PLAYING_PLAY) {
mPlayersService.pause();
} else if (player.getPlaying() == Config.PLAYING_PAUSE) {
mPlayersService.replay();
} else {
mPlayersService.play();
}
v.setBackgroundResource(ImageUtils.getBtnMusicPlayBg());
break;
}
}
/**
* 菜单页点击事件监听器
*/
class MenuClickListener implements OnClickListener {
@Override
public void onClick(View v) {
if (v == itemDown) {
} else if (v == itemScan) {
// startService(new Intent(Main.this, ScanMusic.class));
startActivity(new Intent(Main.this, FirstInstallActivity.class));
} else if (v == itemTimer) {
} else if (v == itemSettings) {
} else if (v == itemQuit) {
KJActivityStack.create().AppExit(aty);
}
resideMenu.closeMenu();
}
}
/**
* 改变界面的fragment
*/
private void changeFragment(Fragment targetFragment, boolean pushStack) {
changeFragment(R.id.main_fragment, targetFragment, pushStack);
}
/**
* 改变界面的fragment
*/
private void changeFragment(int resView, Fragment targetFragment,
boolean pushStack) {
resideMenu.clearIgnoredViewList();// 清空不拦截触摸事件的控件(界面已经被替换)
FragmentTransaction transaction = getFragmentManager()
.beginTransaction();
// 使用传入的fragment替换主界面的fragment
transaction.replace(resView, targetFragment, "fragment");
// 设置动画样式
transaction
.setTransitionStyle(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
if (pushStack) {
// 添加到返回栈(使用户按下返回键时可以返回上一个界面)
transaction.addToBackStack(null);
}
// 提交
transaction.commit();
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return resideMenu.onInterceptTouchEvent(ev)
|| super.dispatchTouchEvent(ev);
}
public ResideMenu getResideMenu() {
return resideMenu;
}
@Override
public void unRegisterBroadcast() {
super.unRegisterBroadcast();
unregisterReceiver(changeReceiver);
}
@Override
protected void onDestroy() {
super.onDestroy();
this.unbindService(conn);
}
/**
* ServiceConnection实现类
*/
class Connection implements ServiceConnection {
@Override
public void onServiceDisconnected(ComponentName name) {
ViewInject.toast("呀,音乐播放失败,退出再进试试");
mPlayersService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
mPlayersService = ((PlayerService.LocalPlayer) service)
.getService();
}
}
/**
* BroadcastReceiver类
*/
public class MusicChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (Config.RECEIVER_MUSIC_CHANGE.equals(intent.getAction())) {
if (Player.getPlayer().getPlaying() != Config.PLAYING_STOP) {
refreshBottomBar();
}
lyricFragment.refreshLrcView();
} else if (Config.RECEIVER_ERROR.endsWith(intent.getAction())) {
ViewInject.toast(intent.getStringExtra("error"));
}
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (isOpen) {
wantScroll();
} else {
resideMenu.openMenu();
// moveTaskToBack(false);
}
return true;
} else if (keyCode == KeyEvent.KEYCODE_MENU) {
resideMenu.openMenu();
return true;
} else {
return false;
}
}
/************************************************************************************
*
* 抽屉效果策略
*
************************************************************************************/
public void wantScroll(Main aty) {
if (isOpen) {
aty.scrollToLrc();
} else {
aty.scrollToContent();
}
}
private void wantScroll() {
if (isOpen) {
scrollToLrc();
} else {
scrollToContent();
}
}
private void scrollToLrc() {
new ScrollTask().execute(15);
isOpen = false;
}
private void scrollToContent() {
new ScrollTask().execute(-15);
isOpen = true;
}
private void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
class ScrollTask extends AsyncTask<Integer, Integer, Integer> {
@Override
protected Integer doInBackground(Integer... speed) {
int topMargin = contentParams.topMargin;
// 根据传入的速度来滚动界面,当滚动到达左边界或右边界时,跳出循环。
while (true) {
topMargin += speed[0];
if (topMargin > screenHeight) {
topMargin = screenHeight;
break;
}
if (topMargin < 0) {
topMargin = 0;
break;
}
publishProgress(topMargin);
// 每次循环使线程睡眠,这样肉眼才能够看到滚动动画。
sleep(10);
}
return topMargin;
}
@Override
protected void onProgressUpdate(Integer... left) {
contentParams.topMargin = left[0];
lyricView.setLayoutParams(contentParams);
lyricView.invalidate();
}
@Override
protected void onPostExecute(Integer left) {
contentParams.topMargin = left;
lyricView.setLayoutParams(contentParams);
}
}
}