viewpager+定时器实现图片的上下滑动并播放音乐

关键代码:
在activity中写入如下代码:

private ScheduledThreadPoolExecutor exec;//线程池
private VerticalAdapter vAdapter1;//垂直ViewPager的adapter
private VerticalViewPager verticalPager1;//垂直ViewPager
private List<View> pageViews;//存放imageview的List
private List<String> mediaUrls;// 音乐和图片url
private 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. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        sLogger.i("MeetingStartActivity:onCreate");
        setContentView(R.layout.splash_activity);
        initView();
        readCacheFile();    
    }

@Override
protected 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();
    }
}
// 初始化View
private 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);
}

@Override
public 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;
    }
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
        boolean fromUser) {
}

@Override
public void onStartTrackingTouch(SeekBar seekBar) {
    isChanging = true;

}

@Override
public 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;
}


@Override
protected void onStop() {
    exec.shutdown();
    isChanging = true;
    super.onStop();
}
//按home键保存音乐的状态
@Override
protected void onResume() {
    if (mPlayer != null) {
        if (!mPlayer.isPlaying()) {
            seekBar1.setProgress(mPlayer.getCurrentPosition());
            play.setBackgroundResource(R.drawable.paused);
            mPlayer.start();
        }
    }
    super.onResume();
}

@Override
protected 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值