viewpager+定时器实现图片的上下滑动并播放音乐
来源:互联网 发布:golang defer return 编辑:程序博客网 时间:2024/05/20 17:28
关键代码:
在activity中写入如下代码:
private ScheduledThreadPoolExecutor exec;//线程池private VerticalAdapter vAdapter1;//垂直ViewPager的adapterprivate VerticalViewPager verticalPager1;//垂直ViewPagerprivate List<View> pageViews;//存放imageview的Listprivate List<String> mediaUrls;// 音乐和图片urlprivate Button play;// 播放按钮/** * true 播放音乐 false 停止播放 */ boolean isPlaying = false; private MediaPlayer mPlayer; private SharedPreferences sp; /** * true 请求JSON数据 false 不请求 */ public boolean isRequest = true; private SeekBar seekBar1;// private Timer timer; private TimerTask timerTask; private boolean isChanging = false;// 互斥变量,防止定时器与SeekBar拖动时进度冲突 private int currentItem = 0;// 当前页面 // 得到音乐和图片的url protected static final int SUCCESS_GET_URL = 1; // 读取缓存文件后刷新adapter private static final int CACHEFILE = 2; // 读取缓存 private static final int LOADMEDIA = 3; private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { verticalPager1.setCurrentItem(currentItem); switch (msg.what) { case SUCCESS_GET_URL:// 下载数据 loadeMedia(); break; case CACHEFILE:// 刷新adapter updateAdapter(); break; case LOADMEDIA:// 读取缓存 isRequest = false; readCacheFile(); break; } } // 更新adapter显示图片 private void updateAdapter() { vAdapter1 = new VerticalAdapter(pageViews); verticalPager1.setAdapter(vAdapter1); vAdapter1.notifyDataSetChanged(); findViewById(R.id.loading).setVisibility(View.GONE); rMedia.setVisibility(View.VISIBLE); verticalPager1.setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { currentItem = position; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { Log.e("sc", "----position----" + position + "----->positionOffset---" + positionOffset + "---->positionOffsetPixels---" + positionOffsetPixels); if (position == pageViews.size() - 1) { verticalPager1.setCurrentItem(0, false); } } @Override public void onPageScrollStateChanged(int state) { if (state == 1 && exec != null) { if (!exec.isShutdown()) { Log.e("1", "-----shutdown----"); exec.shutdown(); exec = null; } } else if (state == 0) { Log.e("1", "----start----"); synchronized (_lock) { if (exec == null) { exec = new ScheduledThreadPoolExecutor(1); exec.scheduleAtFixedRate(new ViewPagerTask(), 5, 5, TimeUnit.SECONDS); } } } } }); }};byte[] _lock = new byte[1];/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); sLogger.i("MeetingStartActivity:onCreate"); setContentView(R.layout.splash_activity); initView(); readCacheFile(); }@Overrideprotected void onStart() { // 用一个定时器 来完成图片切换 // Timer 与 ScheduledExecutorService 实现定时器的效果 // scheduledExecutorService = //Executors.newScheduledThreadPool(3); exec = new ScheduledThreadPoolExecutor(1); // 通过定时器 来完成 每2秒钟切换一个图片 // 经过指定的时间后,执行所指定的任务 // scheduleAtFixedRate(command, initialDelay, period, unit) // command 所要执行的任务 // initialDelay 第一次启动时 延迟启动时间 // period 每间隔多次时间来重新启动任务 // unit 时间单位 // .scheduleAtFixedRate(command, initialDelay, period, unit) exec.scheduleAtFixedRate(new ViewPagerTask(), 5, 5, TimeUnit.SECONDS); super.onStart(); }// 用来完成图片切换的任务private class ViewPagerTask implements Runnable { public void run() { // 实现我们的操作 // 改变当前页面 currentItem = (currentItem + 1) % pageViews.size(); // Handler来实现图片切换 handler.obtainMessage().sendToTarget(); }}// 初始化Viewprivate void initView() { pageViews = new ArrayList<View>(); mediaUrls = new ArrayList<String>(); mPlayer = new MediaPlayer(); mPlayer.setOnCompletionListener(new OnCompletionListener() { @Override public void onCompletion(MediaPlayer mp) { SystemClock.sleep(1000); mPlayer.seekTo(0); play.setBackgroundResource(R.drawable.player); isPlaying = false; } }); verticalPager1 = (VerticalViewPager) findViewById(R.id.pager1); musicName = (TextView) findViewById(R.id.tv_music_name); rMedia = (RelativeLayout) findViewById(R.id.rl_media); downMusic.setOnClickListener(this); seekBar1 = (SeekBar) findViewById(R.id.seekBar1); seekBar1.setOnSeekBarChangeListener(this); // 播放音乐按钮 play = (Button) findViewById(R.id.btn_play);}@Overridepublic void onClick(View v) { switch (v.getId()) { case R.id.btn_play: playMusic(); break; }}/** * 播放音乐 */private void playMusic() { if (!isPlaying) { mPlayer.start(); play.setBackgroundResource(R.drawable.paused); isPlaying = true; } else { mPlayer.pause(); play.setBackgroundResource(R.drawable.player); isPlaying = false; }}@Overridepublic void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {}@Overridepublic void onStartTrackingTouch(SeekBar seekBar) { isChanging = true;}@Overridepublic void onStopTrackingTouch(SeekBar seekBar) { mPlayer.seekTo(seekBar.getProgress()); isChanging = false;}/** * 读取缓存文件 */private void readCacheFile() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { String musicDir = "/sdcard/meeting" + AppConfig.APP_ID + "/music/"; String imageDir = "/sdcard/meeting" + AppConfig.APP_ID + "/image/"; File musDirFile = new File(musicDir); File imageDirFile = new File(imageDir); if (!musDirFile.exists()) { sp = null; mediaRequest();//异步请求网络音乐和图片的url } else {// 读取音乐/图片 if (isRequest) { sp = getSharedPreferences("mediaurl", MODE_PRIVATE); mediaRequest(); return; } sLogger.d("isrequest------>" + isRequest); File[] musFiles = musDirFile.listFiles(); File[] imageFiles = imageDirFile.listFiles(); if (musFiles.length > 0 && imageFiles.length > 0) { for (File file : musFiles) { if (file.exists()) { // Uri u = Uri.fromFile(file.getAbsoluteFile()); // mPlayer = // MediaPlayer.create(MeetingStartActivity.this, u); try { musicName.setText(sp.getString("name", "123.mp3")); mPlayer.setDataSource(file.getAbsolutePath()); mPlayer.prepare(); play.setBackgroundResource(R.drawable.paused); isPlaying = true; } catch (Exception e) { e.printStackTrace(); } // 设置进度条 seekBar1.setMax(mPlayer.getDuration()); // 定时器记录播放进度 timer = new Timer(); timerTask = new TimerTask() { @Override public void run() { if (isChanging) { return; } seekBar1.setProgress(mPlayer.getCurrentPosition()); } }; timer.schedule(timerTask, 0, 10); mPlayer.start(); } } File firstfile = imageFiles[0]; Bitmap bitmap2 = BitmapFactory.decodeFile(firstfile .getAbsolutePath()); ImageView firstImage = new ImageView( MeetingStartActivity.this); Drawable drawable2 = new BitmapDrawable(bitmap2); firstImage.setBackground(drawable2); for (File file : imageFiles) { if (file.exists()) { try { FileInputStream is = new FileInputStream(file); Bitmap bitmap = BitmapFactory.decodeStream(is); ImageView imageView = new ImageView( MeetingStartActivity.this); Drawable drawable = new BitmapDrawable(bitmap); imageView.setBackground(drawable); pageViews.add(imageView); } catch (FileNotFoundException e) { e.printStackTrace(); } } } pageViews.add(firstImage); Message msg = Message.obtain(); msg.what = CACHEFILE; handler.sendMessage(msg); } else { try { String mediaurl = sp.getString("media", null); JSONArray array = new JSONArray(mediaurl); int length = array.length(); for (int i = 0; i < length; i++) { ImageMusicInfo item = ImageMusicInfo .getFromJSON((JSONObject) array.get(i)); if (item.imageUrl != null) { mediaUrls.add(item.imageUrl); } } loadeMedia(); } catch (JSONException e) { e.printStackTrace(); } } } }}// 异步请求数据 private void mediaRequest() { if (mRegisterTask != null) { sLogger.d("mRegisterTask still running "); return; } findViewById(R.id.loading).setVisibility(View.VISIBLE); mRegisterTask = new ImageMusicTask(); String requestURL = URLHandler.getReqeust(URLHandler.URL_IMAGE, "meetingid", AppConfig.APP_ID); sLogger.i("requestURL:======>" + requestURL); mRegisterTask.execute(requestURL);}private class ImageMusicTask extends HttpGetTask { private ImageMusicInfo item; @Override protected void onPostExecute(String result) { mRegisterTask = null; // findViewById(R.id.include_layout_loading).setVisibility( // View.GONE ); sLogger.i("ImageMusicTask:------>" + result); try { if (result != null) { if ("[]".equals(result) || "".equals(result)) { Toast.makeText(MeetingStartActivity.this, "未找到资源", 0) .show(); findViewById(R.id.loading).setVisibility(View.GONE); return; } /* *将第一次请求的数据保存到sp中,用于判断服务端是否更新了数据,若没有直接读缓存,否则根据最新的音乐和图片url下载文件并删除原来的文件 */ if (sp == null) { sp = getSharedPreferences("mediaurl", MODE_PRIVATE); } else { String oldResult = sp.getString("media", null); if (oldResult !=null && oldResult.equals(result)) { // 相等读缓存,不等删除原文件并下载数据 isRequest = false; sLogger.w("isRequest========>" + isRequest); readCacheFile(); return; } } Editor edit = sp.edit(); edit.putString("media", result); edit.commit(); sLogger.e("sp------>" + sp.getString("media", null)); JSONArray array = new JSONArray(result); int length = array.length(); for (int i = 0; i < length; i++) { item = ImageMusicInfo.getFromJSON((JSONObject) array .get(i)); if (item.imageUrl != null) { mediaUrls.add(item.imageUrl); } if(item.name != null){//保存音乐文件名称 Editor edit2 = sp.edit(); edit2.putString("name", item.name); edit2.commit(); } } // 获取音乐图片url成功发送handler下载数据 Message msg = Message.obtain(); msg.what = SUCCESS_GET_URL; handler.sendMessage(msg); } else { Toast.makeText(MeetingStartActivity.this, "未找到资源", 0) .show(); findViewById(R.id.loading).setVisibility(View.GONE); } } catch (Exception e) { e.printStackTrace(); } }}/** * 下载音乐,图片 * * @param path */protected void loadeMedia() { new Thread() { private File dir; private InputStream is = null; private FileOutputStream fos = null; public void run() { try { deleteCachFile(); if (mediaUrls != null && mediaUrls.size() > 0) { for (int i = 0; i < mediaUrls.size(); i++) { String path = mediaUrls.get(i); int index = path.lastIndexOf("."); String str = path.substring(index + 1, path.length()); HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(path); client.getParams().setParameter( CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); client.getParams().setParameter( CoreConnectionPNames.SO_TIMEOUT, 10000); HttpResponse response = client.execute(httpGet); int statusCode = response.getStatusLine() .getStatusCode(); if (statusCode == 200) { is = response.getEntity().getContent(); if (Environment.getExternalStorageState() .equals(Environment.MEDIA_MOUNTED)) {// 判断SD卡是否安装 String filePath = "/sdcard/"; String fileName = "meeting" + AppConfig.APP_ID; File file2 = new File(filePath + fileName); if (!file2.exists()) { file2.mkdir(); } String musicFile = filePath + fileName + "/music"; File file3 = new File(musicFile); if (!file3.exists()) { file3.mkdir(); } String picFile = filePath + fileName + "/image"; File file4 = new File(picFile); if (!file4.exists()) { file4.mkdir(); } // save file int fileIndex = path.lastIndexOf("/"); String name = path.substring(fileIndex + 1, path.length()); if (isImage(str)) { dir = new File(file4, name); } if (isAuto(str)) { dir = new File(file3, name); } fos = new FileOutputStream(dir); byte[] by = new byte[1024]; int len = 0; while ((len = is.read(by)) != -1) { fos.write(by, 0, len); } } } } // 文件下载完成发送handler读取缓存 Message msg = Message.obtain(); msg.what = LOADMEDIA; handler.sendMessage(msg); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } if (is != null) { try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } }.start();}/** * 删除缓存文件 */protected void deleteCachFile() { if (Environment.getExternalStorageState().equals( Environment.MEDIA_MOUNTED)) { String musicDir = "/sdcard/meeting" + AppConfig.APP_ID + "/music/"; String imageDir = "/sdcard/meeting" + AppConfig.APP_ID + "/image/"; File musicFile = new File(musicDir); File imageFile = new File(imageDir); if (musicFile.exists()) { File[] listMusic = musicFile.listFiles(); if (listMusic != null && listMusic.length > 0) { for (File file : listMusic) { if (file.isFile() && file.exists()) { file.delete(); } } } File[] listImage = imageFile.listFiles(); if (listImage != null && listImage.length > 0) { for (File file : listImage) { if (file.isFile() && file.exists()) { file.delete(); } } } } }}/** * 判断图片类型 * * @param type * 文件后缀名 * @return */public boolean isImage(String type) { if (type != null && (type.equals("jpg") || type.equals("gif") || type.equals("png") || type.equals("jpeg") || type.equals("bmp") || type.equals("wbmp") || type.equals("ico") || type.equals("jpe"))) { return true; } return false;}/** * 判断音乐类型 * * @param type文件后缀名 * @return */public boolean isAuto(String type) { if (type != null && (type.equals("mp3") || type.equals("wav") || type.equals("rm") || type.equals("swf") || type.equals("wma") || type.equals("asf"))) { return true; } return false;}@Overrideprotected void onStop() { exec.shutdown(); isChanging = true; super.onStop();}//按home键保存音乐的状态@Overrideprotected void onResume() { if (mPlayer != null) { if (!mPlayer.isPlaying()) { seekBar1.setProgress(mPlayer.getCurrentPosition()); play.setBackgroundResource(R.drawable.paused); mPlayer.start(); } } super.onResume();}@Overrideprotected void onPause() { if (mPlayer != null) { if (mPlayer.isPlaying()) { mPlayer.pause(); play.setBackgroundResource(R.drawable.player); } } super.onPause();}protected void onDestroy() { isRequest = true; if (mPlayer != null) { if (mPlayer.isPlaying()) { mPlayer.stop(); } mPlayer.release(); } sLogger.e("isrequest---->" + isRequest + "isChanging---->" + isChanging); super.onDestroy();}
java类ImageMusicInfo:
public class ImageMusicInfo {public String id;public String meetingid;public String imageUrl;public String name;public static ImageMusicInfo getFromJSON(JSONObject object) { ImageMusicInfo result = new ImageMusicInfo(); try { if (object.has("id")) result.id = object.getString("id"); if (object.has("meetingid")) result.meetingid = object.getString("meetingid"); if(object.has("pic")){ String picUrl = object.optString("pic");// String type = object.optString("type"); if(picUrl != null){// if("1".equals(type)){ result.imageUrl = picUrl;// }else if("2".equals(type)){// result.musicUrl=picUrl;// } } } if(object.has("name") && object.has("type")){ String name = object.optString("name"); String type = object.optString("type"); if("2".equals(type)){ result.name = name; } } } catch (JSONException e) { e.printStackTrace(); } return result; }}
垂直的ViewPager下载地址:文件名是minimal.zip
http://c38.yunpan.360.cn/my/index/#%2F%E6%96%87%E6%A1%A3%2F%E6%96%87%E4%BB%B6%2F
0 0
- viewpager+定时器实现图片的上下滑动并播放音乐
- 用viewpager实现网络图片的加载并滑动
- 使用ViewPager实现图片自动播放效果,并可左右滑动
- 关于上下滑动的viewpager
- 基于android的网络音乐播放器-添加viewpager和fragment实现滑动切换多个界面(二)
- 定时器-图片或者文字上下播放
- 播放音乐 上下播放
- 播放音乐 上下播放
- jquery实现上下滑动图片
- 继承ViewPager实现上下滑动整页
- Android 实现可以自由移动缩放的图片控件并实现ViewPager滑动
- android viewPager 实现图片无限循环滑动并带有进度的自定义布局
- Tab随ViewPager的滑动上下滚动
- Fragment嵌套ViewPager的网络获取数据实现滑动播放
- 安卓ViewPager中嵌套ViewPager的滑动冲突解决,定时器实现ViewPager的无限左右滑动。
- Android实现滑动图片(ViewPager)
- viewPager实现图片左右滑动
- Android音乐播放器 -- 滑动切换实现
- 羅芃莃袄袄芅葿蚀膆膈蒄衿
- 薆袈罿蒈薅蚈膅莄薅螀肈芀
- 分布式存储系统概述
- 蒁羄肂莅螆羀芁芄蝿肅羇薇
- 膀芁蚀袇莂蒆蚆袆肂羀膂蒆
- viewpager+定时器实现图片的上下滑动并播放音乐
- 蚅芆蕿薈螁羃葿薀袇膁芈蒃
- 薇羅肃薈螂袁肂芈薅螇膁莀
- 【bzoj 3543】: [ONTAK2010]Garden
- jsoncpp的生成和使用
- AMA: Yoshua Bengio (self.MachineLearning)
- 复习虚函数
- windows下编辑脚本文件在linux下出现错误
- Java的Arrays-笔记