安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用




安卓开发之WebView,进度条ProgressBar以及MediaPlayer和SonundPool的使用








      内容比较简单,仅用作笔记,所以就不过多解释,有一些地方代码思路不是很清晰,有点乱,日后会进行修改的。


1、新建一个SoundPool管理器,实现soundpool的创建,加载以及播放音频等功能

  1. package com.example.myexplorer;  
  2. import java.util.Random;  
  3.   
  4. import android.annotation.SuppressLint;  
  5. import android.content.Context;  
  6. import android.media.AudioAttributes;  
  7. import android.media.SoundPool;  
  8. import android.media.SoundPool.OnLoadCompleteListener;  
  9. import android.os.Build;  
  10. import android.os.Handler;  
  11. import android.os.Message;  
  12. import android.util.Log;  
  13. import android.util.SparseArray;  
  14.   
  15. public class SoundPoolManager implements OnLoadCompleteListener{  
  16.     Context context;  
  17.     SoundPool soundPool;  
  18.     MyHandler myHandler;  
  19.     private final int SOUND_LOAD_OK=1;  
  20.     //创建一个SpareseArray对象来存放管理音频资源  
  21.     private SparseArray<Object> soundMap=new SparseArray<>();   
  22.     //实现构造函数,传递context  
  23.     public SoundPoolManager(Context context) {  
  24.         // TODO Auto-generated constructor stub  
  25.         this.context=context;  
  26.     }  
  27.       
  28.       
  29. / 
  30.   创建一个SoundPool池,回调时需要指定创建的池的最大可容纳数量,声音类型以及音频品质 
  31.  /  
  32.     @SuppressLint(“NewApi”)  
  33.     @SuppressWarnings(“deprecation”)  
  34.     protected void creatSounPool(int maxStreams,int streamType,int srcQuality) {  
  35.         if(Build.VERSION.SDK_INT>=21) {                                  //判断为安卓5以上时使用该方法创建,否则5.0以上系统不会播放  
  36.             AudioAttributes abs = new AudioAttributes.Builder()  
  37.                     .setUsage(AudioAttributes.USAGE_MEDIA)  
  38.                     .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)  
  39.                     .build() ;  
  40.             soundPool=new SoundPool.Builder()  
  41.                     .setMaxStreams(5)  
  42.                     .setAudioAttributes(abs)  
  43.                     .build();   //创建一个SoundPool对象,该对象可以容纳5个音频流  
  44.             }  
  45.         else  
  46.             soundPool=new SoundPool(maxStreams,streamType,srcQuality);   //安卓5以下的soundpool创建方法  
  47.         Log.i(”SoundPoolCreat”,“successfull”);  
  48.     }  
  49.     / 
  50.       加载资源到创建好的SoundPool里面,需要提供音频资源名称以及优先级 
  51.      /  
  52.     protected void load(String[] ResourcesName,int priority) {  
  53.         for(int i=0;i<ResourcesName.length;i++) {  
  54.         soundMap.put(i,soundPool.load(context,context.getResources().  
  55.                 getIdentifier(”com.example.myexplorer:raw/”+ResourcesName[i]  
  56.                         ,null,null) ,priority));  
  57.         Log.i(”SoundPoolLoad”+i,“successfull”);  
  58.         }  
  59.         soundPool.setOnLoadCompleteListener(this);  
  60.           
  61.     }  
  62.     / 
  63.       开始播放,要求提供左声道音量leftVolume,右声道音量rightVolume,播放优先级priority,是否循环loop(0为不循环,1为循环) 
  64.       播放速率rate 
  65.      /  
  66.     protected void play(float leftVolume,  
  67.             float rightVolume,int priority,int loop,float rate) {  
  68.         int i=0;  
  69.       
  70.         //随机播放加载的三个背景音乐  
  71.             soundPool.play((int)soundMap.get((int)(new Random().nextInt(3))),  //产生等概率0-2的随机数  
  72.                     leftVolume, rightVolume, priority, loop, rate);  
  73.         Log.i(”SoundPoolPlay”+(i++),“successfull”);  
  74.     }  
  75.     / 
  76.       设置加载完成监听,防止未加载完成就播放 
  77.      */  
  78.     @SuppressLint(“HandlerLeak”)  
  79.     @Override  
  80.     public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {  
  81.           
  82.         // TODO Auto-generated method stub  
  83.         Log.i(”Load”,“Complete”);  
  84.         myHandler=new MyHandler();  
  85.         Message message=myHandler.obtainMessage();  
  86.         message.what=SOUND_LOAD_OK;  
  87.         myHandler.sendMessage(message);  
  88.     }  
  89.     @SuppressLint(“HandlerLeak”)  
  90.     public class MyHandler extends Handler{  
  91.   
  92.         private final int SOUND_LOAD_OK=1;  
  93.         @Override  
  94.         public void handleMessage(Message msg) {  
  95.             switch (msg.what) {  
  96.             case SOUND_LOAD_OK:  
  97.                 //这里添加加载完成后需要做的事  
  98.                 //play(1, 1, 0, 0, 1);  
  99.                 break;  
  100.             default:  
  101.                 break;  
  102.             }  
  103.         }  
  104.     }  
  105. }  
package com.example.myexplorer; 
import java.util.Random;

import android.annotation.SuppressLint;
import android.content.Context;
import android.media.AudioAttributes;
import android.media.SoundPool;
import android.media.SoundPool.OnLoadCompleteListener;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.util.SparseArray;

public class SoundPoolManager implements OnLoadCompleteListener{
Context context;
SoundPool soundPool;
MyHandler myHandler;
private final int SOUND_LOAD_OK=1;
//创建一个SpareseArray对象来存放管理音频资源
private SparseArray<Object> soundMap=new SparseArray<>();
//实现构造函数,传递context
public SoundPoolManager(Context context) {
// TODO Auto-generated constructor stub
this.context=context;
}

/*
* 创建一个SoundPool池,回调时需要指定创建的池的最大可容纳数量,声音类型以及音频品质
*/
@SuppressLint("NewApi")
@SuppressWarnings("deprecation")
protected void creatSounPool(int maxStreams,int streamType,int srcQuality) {
if(Build.VERSION.SDK_INT>=21) { //判断为安卓5以上时使用该方法创建,否则5.0以上系统不会播放
AudioAttributes abs = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build() ;
soundPool=new SoundPool.Builder()
.setMaxStreams(5)
.setAudioAttributes(abs)
.build(); //创建一个SoundPool对象,该对象可以容纳5个音频流
}
else
soundPool=new SoundPool(maxStreams,streamType,srcQuality); //安卓5以下的soundpool创建方法
Log.i("SoundPoolCreat","successfull");
}
/*
* 加载资源到创建好的SoundPool里面,需要提供音频资源名称以及优先级
*/
protected void load(String[] ResourcesName,int priority) {
for(int i=0;i<ResourcesName.length;i++) {
soundMap.put(i,soundPool.load(context,context.getResources().
getIdentifier("com.example.myexplorer:raw/"+ResourcesName[i]
,null,null) ,priority));
Log.i("SoundPoolLoad"+i,"successfull");
}
soundPool.setOnLoadCompleteListener(this);

}
/*
 * 开始播放,要求提供左声道音量leftVolume,右声道音量rightVolume,播放优先级priority,是否循环loop(0为不循环,1为循环)
 * 播放速率rate
 */
protected void play(float leftVolume,
        float rightVolume,int priority,int loop,float rate) {
    int i=0;

    //随机播放加载的三个背景音乐
        soundPool.play((int)soundMap.get((int)(new Random().nextInt(3))),  //产生等概率0-2的随机数
                leftVolume, rightVolume, priority, loop, rate);
    Log.i("SoundPoolPlay"+(i++),"successfull");
}
/*
 * 设置加载完成监听,防止未加载完成就播放
 */
@SuppressLint("HandlerLeak")
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {

    // TODO Auto-generated method stub
    Log.i("Load","Complete");
    myHandler=new MyHandler();
    Message message=myHandler.obtainMessage();
    message.what=SOUND_LOAD_OK;
    myHandler.sendMessage(message);
}
@SuppressLint("HandlerLeak")
public class MyHandler extends Handler{

    private final int SOUND_LOAD_OK=1;
    @Override
    public void handleMessage(Message msg) {
        switch (msg.what) {
        case SOUND_LOAD_OK:
            //这里添加加载完成后需要做的事
            //play(1, 1, 0, 0, 1);
            break;
        default:
            break;
        }
    }
}

}

需要注意的是,代码中出现了这么一个判断API的代码段:

  1. if(Build.VERSION.SDK_INT>=21)  
if(Build.VERSION.SDK_INT>=21)

      这是因为安卓5以上不再支持直接new一个SoundPool的方法来创建soundpool池,而是提供了利用SoundPool.Builedr以及

AudioAttributes.Builder来创建,如下:

  1. AudioAttributes abs = new AudioAttributes.Builder()  
  2.                     .setUsage(AudioAttributes.USAGE_MEDIA)  
  3.                     .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)  
  4.                     .build() ;  
  5. soundPool=new SoundPool.Builder()  
  6.             .setMaxStreams(5)  
  7.             .setAudioAttributes(abs)  
  8.             .build();   //创建一个SoundPool对象,该对象可以容纳5个音频流  
AudioAttributes abs = new AudioAttributes.Builder() 
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build() ;
soundPool=new SoundPool.Builder()
.setMaxStreams(5)
.setAudioAttributes(abs)
.build(); //创建一个SoundPool对象,该对象可以容纳5个音频流

2、MainActivity的代码:

  1. package com.example.myexplorer;  
  2.   
  3. import java.util.concurrent.LinkedBlockingDeque;  
  4. import java.util.concurrent.ThreadPoolExecutor;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. import com.example.myexplorer.R;  
  8. import android.annotation.SuppressLint;  
  9. import android.app.Activity;  
  10. import android.content.Intent;  
  11. import android.media.AudioManager;  
  12. import android.net.Uri;  
  13. import android.os.Build;  
  14. import android.os.Bundle;  
  15. import android.os.Handler;  
  16. import android.util.DisplayMetrics;  
  17. import android.util.Log;  
  18. import android.view.KeyEvent;  
  19. import android.view.MotionEvent;  
  20. import android.view.View;  
  21. import android.view.View.OnTouchListener;  
  22. import android.view.Window;  
  23. import android.webkit.DownloadListener;  
  24. import android.webkit.WebChromeClient;  
  25. import android.webkit.WebSettings;  
  26. import android.webkit.WebView;  
  27. import android.webkit.WebViewClient;  
  28. import android.widget.ProgressBar;  
  29. import android.widget.Toast;  
  30.   
  31. @SuppressLint({ “InlinedApi”“ClickableViewAccessibility”“SetJavaScriptEnabled” })  
  32. public class MainActivity extends Activity implements OnTouchListener{  
  33.   
  34.     private WebView webView;  
  35.     int width,height,keyBack=0;  
  36.     View decorView;  
  37.     Thread thread;  
  38.       
  39.     private ThreadPoolExecutor poolExecutor;  
  40.       
  41.     SoundPoolManager soundPoolManager;     //获取音频播放管理器  
  42.     String[] musicName= {”music”,“music1”,“music3”};//定义一个String数组来存放需要加载的音乐的名称  
  43.     float Y;  
  44.     private float downX,downY;  
  45.     private ProgressBar pg1;    
  46.     @Override  
  47.     protected void onCreate(Bundle savedInstanceState) {  
  48.         super.onCreate(savedInstanceState);  
  49.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  
  50.         setContentView(R.layout.activity_main);  
  51.         / 
  52.           初始化控件 
  53.         /  
  54.         webView=(WebView)findViewById(R.id.webview);  //实例化一个webview浏览组件  
  55.         pg1=(ProgressBar) findViewById(R.id.progressbar);   
  56.         soundPoolManager=new SoundPoolManager(this);  //实例化音频管理器  
  57.          // 获得decorView  
  58.         decorView = getWindow().getDecorView();  
  59.         webView.setOnTouchListener(this);         //为webview添加触摸事件监控  
  60.         // 获得手机屏幕的宽度和高度,单位像素  
  61.         DisplayMetrics metrics = new DisplayMetrics();  
  62.         getWindowManager().getDefaultDisplay().getMetrics(metrics);  
  63.         width = metrics.widthPixels;  
  64.         height = metrics.heightPixels;  
  65.         creatMyWebView(webView);                      //创建currentWebView  
  66.         webView.loadUrl(https://w.heiyan.com/);     //传递需要加载的网页     
  67.         //从线程池中拿出一个线程来播放音乐,线程池具体额参数如下  
  68.         / 
  69.           public ThreadPoolExecutor(   
  70. //核心线程数,除非allowCoreThreadTimeOut被设置为true,否则它闲着也不会死   
  71. int corePoolSize,    
  72. //最大线程数,活动线程数量超过它,后续任务就会排队                      
  73. int maximumPoolSize,    
  74. //超时时长,作用于非核心线程(allowCoreThreadTimeOut被设置为true时也会同时作用于核心线程),闲置超时便被回收              
  75. long keepAliveTime,                             
  76. //枚举类型,设置keepAliveTime的单位,有TimeUnit.MILLISECONDS(ms)、TimeUnit. SECONDS(s)等   
  77. TimeUnit unit,   
  78. //缓冲任务队列,线程池的execute方法会将Runnable对象存储起来   
  79. BlockingQueue<Runnable> workQueue,   
  80. //线程工厂接口,只有一个new Thread(Runnable r)方法,可为线程池创建新线程   
  81. ThreadFactory threadFactory)   
  82.          /  
  83.         poolExecutor = new ThreadPoolExecutor(35,    
  84.                 1, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(128));    
  85.         Runnable runnable1=new Runnable() {  
  86.                   
  87.             @Override  
  88.             public void run() {  
  89.                 // TODO Auto-generated method stub  
  90.                 //开启音频播放  
  91.                 Log.i(”Thread”,“start”);  
  92.                 soundPoolManager.creatSounPool(3, AudioManager.STREAM_MUSIC, 0);  
  93.                 soundPoolManager.load(musicName,1 );  
  94.                 //soundPoolManager.play(1, 1, 5, 0, 1);  
  95.                 try {  
  96.                     Thread.sleep(10000);  
  97.                     handler2.post(runnable2);  
  98.                 } catch (InterruptedException e) {  
  99.                     // TODO Auto-generated catch block  
  100.                     e.printStackTrace();  
  101.                 }  
  102.             }  
  103.         };  
  104.         poolExecutor.execute(runnable1);    //开启线程  
  105.           
  106.         / 
  107.           开启一个新线程,定时置keyBack为0 
  108.          /  
  109.         new Thread(new Runnable() {  
  110.               
  111.             @Override  
  112.             public void run() {  
  113.                 // TODO Auto-generated method stub  
  114.                 handler.post(runnable);//启动计时器,每一秒执行一次runnable.   
  115.             }  
  116.         }).start();  
  117.     }  
  118.     / 
  119.      创建一个handler对象并重写runnable的run方法,实现,当线程启动时,自动启动消息推送 
  120.     /    
  121.     Handler handler=new Handler();    
  122.     Runnable runnable=new Runnable() {    
  123.         @Override    
  124.         public void run() {    
  125.             // TODO Auto-generated method stub    
  126.             //当线程不没有被中断,重复执行消息推送  
  127.             keyBack=0;  
  128.             handler.postDelayed(runnable, 5000);      //自身调用自身,陷入2秒的定时循环  
  129.         }    
  130.     };        
  131.       
  132.     / 
  133.      创建一个handler对象并重写runnable的run方法,实现,当线程启动时,每0-20秒随机播放 
  134.     /    
  135.     Handler handler2=new Handler();    
  136.     Runnable runnable2=new Runnable() {    
  137.         @Override    
  138.         public void run() {    
  139.             // TODO Auto-generated method stub    
  140.             //当线程不没有被中断,重复执行消息推送  
  141.             soundPoolManager.play(11001);  
  142.             Log.i(”AtTime”,“successfull”);  
  143.             handler2.postDelayed(runnable2, (int)(Math.random()20+5)1000);//自身调用自身,陷入2秒的定时循环  
  144.         }    
  145.     };    
  146.     @SuppressLint(“NewApi”)  
  147.     public void creatMyWebView(WebView w) {  
  148.         //加入下载监听器,用于用户第一次支付时下载插件用  
  149.         w.setDownloadListener(new MyWebViewDownLoadListener());    
  150.         w.setWebViewClient(new WebViewClient(){    
  151.             @Override    
  152.             public boolean shouldOverrideUrlLoading(WebView view, String url) {    
  153.                 if( url.startsWith(“http:”) || url.startsWith(“https:”) ) {    
  154.                     return false;    
  155.                 }    
  156.         
  157.                 // Otherwise allow the OS to handle things like tel, mailto, etc.    
  158.                 Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));    
  159.                 startActivity( intent );    
  160.                 return true;    
  161.             }    
  162.         });    
  163.         //支持JS  
  164.         WebSettings settings = w.getSettings();  
  165.         settings.setJavaScriptEnabled(true);  
  166.         w.setWebChromeClient(new WebChromeClient(){  //辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等   
  167.             @Override    
  168.             public void onProgressChanged(WebView view, int newProgress) {    
  169.                 // TODO 自动生成的方法存根    
  170.                     
  171.                 if(newProgress==100){    
  172.                     pg1.setVisibility(View.GONE);//加载完网页进度条消失    
  173.                 }    
  174.                 else{    
  175.                     pg1.setVisibility(View.VISIBLE);//显示进度条    
  176.                     pg1.setProgress(newProgress);//设置进度值    
  177.                 }    
  178.                     
  179.             }    
  180.         });    
  181.           
  182.        //设置webview提供的各个属性  
  183.           
  184.         w.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放。  
  185.         w.getSettings().setSupportZoom(true);    //允许组件具有放大和缩小功能  
  186.         w.getSettings().setBuiltInZoomControls(true);  
  187.         //不显示webview缩放按钮  
  188.         settings.setDisplayZoomControls(false);  
  189.     }  
  190.       
  191.     / 
  192.       下载监听内部类的定义 
  193.      /  
  194.     private class MyWebViewDownLoadListener implements DownloadListener{    
  195.         //添加监听事件即可    
  196.         public void onDownloadStart(String url, String userAgent, String contentDisposition,    
  197.             String mimetype,long contentLength)          {    
  198.                      Uri uri = Uri.parse(url);    
  199.                      Intent intent = new Intent(Intent.ACTION_VIEW, uri);    
  200.                      startActivity(intent);    
  201.                  }    
  202.              }  
  203. / 
  204.   设置触摸监控事件 
  205.  /  
  206.     @Override  
  207.     public boolean onTouch(View v,MotionEvent event) {  
  208.         if(event.getAction() == MotionEvent.ACTION_DOWN){// 当按下时  
  209.             // 获得按下时的X坐标  
  210.             downX = event.getX();  
  211.             downY=event.getY();  
  212.         }else if(event.getAction() == MotionEvent.ACTION_MOVE){// 当手指滑动时  
  213.             // 获得滑过的距离  
  214.             float rightmoveDistanceX = event.getX() - downX;  
  215.             float leftmoveDistanceX = downX-event.getX()  ;  
  216.             Y=Math.abs(event.getY()-downY);  
  217.             if(rightmoveDistanceX > width/5 && Y<height/7){// 如果是向右滑动  
  218.                 webView.setX(rightmoveDistanceX); // 设置界面的X到滑动到的位置  
  219.                 try {  
  220.                     Thread.sleep(10);  
  221.                 } catch (InterruptedException e) {  
  222.                     // TODO Auto-generated catch block  
  223.                     e.printStackTrace();  
  224.                 }  
  225.                 //webView.setY(0);                   //固定住此时webview的Y  
  226.             }  
  227.             else if(leftmoveDistanceX > width/5 && Y<height/7) {  
  228.                 webView.setX(-leftmoveDistanceX); // 设置界面的X到滑动到的位置  
  229.                 //webView.setY(0);                   //固定住此时webview的Y  
  230.                 try {  
  231.                 Thread.sleep(50);  
  232.                 } catch (InterruptedException e) {  
  233.                     // TODO Auto-generated catch block  
  234.                     e.printStackTrace();  
  235.                 }  
  236.             }  
  237.   
  238.         }else if(event.getAction() == MotionEvent.ACTION_UP){// 当抬起手指时  
  239.             // 获得滑过的距离  
  240.             float moveDistanceX = event.getX() - downX;  
  241.             float leftmoveDistanceX= downX-event.getX() ;  
  242.             if(moveDistanceX > width2 / 8 && Y<height/7){  
  243.                  // 如果滑动的距离超过了手机屏幕的一半, 结束当前Activity  
  244.                 if(webView.canGoBack()) {   //如果能够后退则后退操作,如果不行,则提示  
  245.                 webView.goBack();  
  246.                 webView.setX(0); // 设置界面的X到初始位置  
  247.                 }  
  248.                 else {  
  249.                     Toast.makeText(MainActivity.this“没有上一页了”,  
  250.                             Toast.LENGTH_SHORT).show();  
  251.                     webView.setX(0); // 设置界面的X到初始位置  
  252.                 }  
  253.             }else if(leftmoveDistanceX>width*2/8 && Y<height/7) {  
  254.                  if(webView.canGoForward()) {   //如果能够后退则后退操作,如果不行,则提示  
  255.                     webView.goForward();  
  256.                     webView.setX(0); // 设置界面的X到初始位置  
  257.                      }  
  258.                      else   
  259.                          {  
  260.                          Toast.makeText(MainActivity.this“没有下一页了”,  
  261.                                  Toast.LENGTH_SHORT).show();  
  262.                          webView.setX(0); // 设置界面的X到初始位置  
  263.                          }  
  264.             }  
  265.             else// 如果滑动距离没有超过一半  
  266.                 // 恢复初始状态  
  267.                 webView.setX(0);  
  268.             }  
  269.         }  
  270.         return false;  
  271.     }  
  272.   
  273.     / 
  274.       进入沉浸模式,即自动隐藏状态栏以及导航栏 
  275.       @see android.app.Activity#onWindowFocusChanged(boolean) 
  276.      /  
  277.      @Override  
  278.         public void onWindowFocusChanged(boolean hasFocus) {              //进入沉浸模式,即自动隐藏状态栏以及导航栏  
  279.             super.onWindowFocusChanged(hasFocus);  
  280.             //判断是否有焦点  
  281.             if(hasFocus && Build.VERSION.SDK_INT >= 19){  
  282.                 View decorView = getWindow().getDecorView();  
  283.                 decorView.setSystemUiVisibility(  
  284.                         View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  285.                         |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  286.                         |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
  287.                         |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  
  288.                         |View.SYSTEM_UI_FLAG_FULLSCREEN  
  289.                         |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY  
  290.                 );  
  291.   
  292.             }  
  293.         }  
  294.      / 
  295.        设置后退键连按两次退出 
  296.        @see android.app.Activity#onKeyDown(int, android.view.KeyEvent) 
  297.       /  
  298.      @Override  
  299.      public boolean onKeyDown(int keyCode,KeyEvent event) {  
  300.          if(keyCode==KeyEvent.KEYCODE_BACK)  
  301.              {  
  302.              keyBack++;  
  303.              if(keyBack==1) {  
  304.              Toast.makeText(MainActivity.this“再按一次退出”, Toast.LENGTH_SHORT).show();  
  305.              Log.i(”keyBack”,“1”);  
  306.              }  
  307.              else if(keyBack==2)  
  308.               finish();  
  309.              }  
  310.          return true;  
  311.      }  
  312.        
  313.      @Override  
  314.         public void onDestroy() {  
  315.             //soundPoolManager.soundPool.release();  
  316.             super.onDestroy();  
  317.         }  
  318. }  
package com.example.myexplorer;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

import com.example.myexplorer.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.media.AudioManager;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.webkit.DownloadListener;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.ProgressBar;
import android.widget.Toast;

@SuppressLint({ "InlinedApi", "ClickableViewAccessibility", "SetJavaScriptEnabled" })
public class MainActivity extends Activity implements OnTouchListener{

private WebView webView;
int width,height,keyBack=0;
View decorView;
Thread thread;

private ThreadPoolExecutor poolExecutor;

SoundPoolManager soundPoolManager;     //获取音频播放管理器
String[] musicName= {"music","music1","music3"};//定义一个String数组来存放需要加载的音乐的名称
float Y;
private float downX,downY;
private ProgressBar pg1;  
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
    setContentView(R.layout.activity_main);
    /*
     * 初始化控件
    */
    webView=(WebView)findViewById(R.id.webview);  //实例化一个webview浏览组件
    pg1=(ProgressBar) findViewById(R.id.progressbar); 
    soundPoolManager=new SoundPoolManager(this);  //实例化音频管理器
     // 获得decorView
    decorView = getWindow().getDecorView();
    webView.setOnTouchListener(this);         //为webview添加触摸事件监控
    // 获得手机屏幕的宽度和高度,单位像素
    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    width = metrics.widthPixels;
    height = metrics.heightPixels;
    creatMyWebView(webView);                      //创建currentWebView
    webView.loadUrl("https://w.heiyan.com/");     //传递需要加载的网页   
    //从线程池中拿出一个线程来播放音乐,线程池具体额参数如下
    /*
     * public ThreadPoolExecutor(  

//核心线程数,除非allowCoreThreadTimeOut被设置为true,否则它闲着也不会死
int corePoolSize,
//最大线程数,活动线程数量超过它,后续任务就会排队
int maximumPoolSize,
//超时时长,作用于非核心线程(allowCoreThreadTimeOut被设置为true时也会同时作用于核心线程),闲置超时便被回收
long keepAliveTime,
//枚举类型,设置keepAliveTime的单位,有TimeUnit.MILLISECONDS(ms)、TimeUnit. SECONDS(s)等
TimeUnit unit,
//缓冲任务队列,线程池的execute方法会将Runnable对象存储起来
BlockingQueue<Runnable> workQueue,
//线程工厂接口,只有一个new Thread(Runnable r)方法,可为线程池创建新线程
ThreadFactory threadFactory)
*/
poolExecutor = new ThreadPoolExecutor(3, 5,
1, TimeUnit.SECONDS, new LinkedBlockingDeque<Runnable>(128));
Runnable runnable1=new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            //开启音频播放
            Log.i("Thread","start");
            soundPoolManager.creatSounPool(3, AudioManager.STREAM_MUSIC, 0);
            soundPoolManager.load(musicName,1 );
            //soundPoolManager.play(1, 1, 5, 0, 1);
            try {
                Thread.sleep(10000);
                handler2.post(runnable2);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    };
    poolExecutor.execute(runnable1);    //开启线程

    /*
     * 开启一个新线程,定时置keyBack为0
     */
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            handler.post(runnable);//启动计时器,每一秒执行一次runnable. 
        }
    }).start();
}
/*
* 创建一个handler对象并重写runnable的run方法,实现,当线程启动时,自动启动消息推送
*/  
Handler handler=new Handler();  
Runnable runnable=new Runnable() {  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        //当线程不没有被中断,重复执行消息推送
        keyBack=0;
        handler.postDelayed(runnable, 5000);      //自身调用自身,陷入2秒的定时循环
    }  
};      

/*
* 创建一个handler对象并重写runnable的run方法,实现,当线程启动时,每0-20秒随机播放
*/  
Handler handler2=new Handler();  
Runnable runnable2=new Runnable() {  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        //当线程不没有被中断,重复执行消息推送
        soundPoolManager.play(1, 1, 0, 0, 1);
        Log.i("AtTime","successfull");
        handler2.postDelayed(runnable2, (int)(Math.random()*20+5)*1000);//自身调用自身,陷入2秒的定时循环
    }  
};  
@SuppressLint("NewApi")
public void creatMyWebView(WebView w) {
    //加入下载监听器,用于用户第一次支付时下载插件用
    w.setDownloadListener(new MyWebViewDownLoadListener());  
    w.setWebViewClient(new WebViewClient(){  
        @Override  
        public boolean shouldOverrideUrlLoading(WebView view, String url) {  
            if( url.startsWith("http:") || url.startsWith("https:") ) {  
                return false;  
            }  

            // Otherwise allow the OS to handle things like tel, mailto, etc.  
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));  
            startActivity( intent );  
            return true;  
        }  
    });  
    //支持JS
    WebSettings settings = w.getSettings();
    settings.setJavaScriptEnabled(true);
    w.setWebChromeClient(new WebChromeClient(){  //辅助WebView处理Javascript的对话框,网站图标,网站title,加载进度等 
        @Override  
        public void onProgressChanged(WebView view, int newProgress) {  
            // TODO 自动生成的方法存根  

            if(newProgress==100){  
                pg1.setVisibility(View.GONE);//加载完网页进度条消失  
            }  
            else{  
                pg1.setVisibility(View.VISIBLE);//显示进度条  
                pg1.setProgress(newProgress);//设置进度值  
            }  

        }  
    });  

   //设置webview提供的各个属性

    w.getSettings().setUseWideViewPort(true);//设置此属性,可任意比例缩放。
    w.getSettings().setSupportZoom(true);    //允许组件具有放大和缩小功能
    w.getSettings().setBuiltInZoomControls(true);
    //不显示webview缩放按钮
    settings.setDisplayZoomControls(false);
}

/*
 * 下载监听内部类的定义
 */
private class MyWebViewDownLoadListener implements DownloadListener{  
    //添加监听事件即可  
    public void onDownloadStart(String url, String userAgent, String contentDisposition,  
        String mimetype,long contentLength)          {  
                 Uri uri = Uri.parse(url);  
                 Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
                 startActivity(intent);  
             }  
         }

/*
* 设置触摸监控事件
*/
@Override
public boolean onTouch(View v,MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN){// 当按下时
// 获得按下时的X坐标
downX = event.getX();
downY=event.getY();
}else if(event.getAction() == MotionEvent.ACTION_MOVE){// 当手指滑动时
// 获得滑过的距离
float rightmoveDistanceX = event.getX() - downX;
float leftmoveDistanceX = downX-event.getX() ;
Y=Math.abs(event.getY()-downY);
if(rightmoveDistanceX > width/5 && Y<height/7){// 如果是向右滑动
webView.setX(rightmoveDistanceX); // 设置界面的X到滑动到的位置
try {
Thread.sleep(10);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//webView.setY(0); //固定住此时webview的Y
}
else if(leftmoveDistanceX > width/5 && Y<height/7) {
webView.setX(-leftmoveDistanceX); // 设置界面的X到滑动到的位置
//webView.setY(0); //固定住此时webview的Y
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

    }else if(event.getAction() == MotionEvent.ACTION_UP){// 当抬起手指时
        // 获得滑过的距离
        float moveDistanceX = event.getX() - downX;
        float leftmoveDistanceX= downX-event.getX() ;
        if(moveDistanceX &gt; width*2 / 8 &amp;&amp; Y&lt;height/7){
             // 如果滑动的距离超过了手机屏幕的一半, 结束当前Activity
            if(webView.canGoBack()) {   //如果能够后退则后退操作,如果不行,则提示
            webView.goBack();
            webView.setX(0); // 设置界面的X到初始位置
            }
            else {
                Toast.makeText(MainActivity.this, "没有上一页了",
                        Toast.LENGTH_SHORT).show();
                webView.setX(0); // 设置界面的X到初始位置
            }
        }else if(leftmoveDistanceX&gt;width*2/8 &amp;&amp; Y&lt;height/7) {
             if(webView.canGoForward()) {   //如果能够后退则后退操作,如果不行,则提示
                webView.goForward();
                webView.setX(0); // 设置界面的X到初始位置
                 }
                 else 
                     {
                     Toast.makeText(MainActivity.this, "没有下一页了",
                             Toast.LENGTH_SHORT).show();
                     webView.setX(0); // 设置界面的X到初始位置
                     }
        }
        else{ // 如果滑动距离没有超过一半
            // 恢复初始状态
            webView.setX(0);
        }
    }
    return false;
}

/*
 * 进入沉浸模式,即自动隐藏状态栏以及导航栏
 * @see android.app.Activity#onWindowFocusChanged(boolean)
 */
 @Override
    public void onWindowFocusChanged(boolean hasFocus) {              //进入沉浸模式,即自动隐藏状态栏以及导航栏
        super.onWindowFocusChanged(hasFocus);
        //判断是否有焦点
        if(hasFocus &amp;&amp; Build.VERSION.SDK_INT &gt;= 19){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    |View.SYSTEM_UI_FLAG_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            );

        }
    }
 /*
  * 设置后退键连按两次退出
  * @see android.app.Activity#onKeyDown(int, android.view.KeyEvent)
  */
 @Override
 public boolean onKeyDown(int keyCode,KeyEvent event) {
     if(keyCode==KeyEvent.KEYCODE_BACK)
         {
         keyBack++;
         if(keyBack==1) {
         Toast.makeText(MainActivity.this, "再按一次退出", Toast.LENGTH_SHORT).show();
         Log.i("keyBack","1");
         }
         else if(keyBack==2)
          finish();
         }
     return true;
 }

 @Override
    public void onDestroy() {
        //soundPoolManager.soundPool.release();
        super.onDestroy();
    }

}

3、MediaPlayer的代码

  1. package com.example.myexplorer;  
  2. import android.content.Context;  
  3. import android.media.MediaPlayer;  
  4. import android.util.Log;  
  5.   
  6. public class mediaplayer {  
  7.   
  8.     Context context;  
  9.     MediaPlayer myMediaPlayer;  
  10.     public mediaplayer(Context context) {  
  11.         this.context=context;  
  12.     }  
  13.     protected void creatMediaPlayer() {  
  14.         Log.i(”Creat”,“begin”);  
  15.         //通过mediaPlayer的静态方法creat创建一个MediaPlayer对象  
  16.         myMediaPlayer=MediaPlayer.create(context,  
  17.                 context.getResources().getIdentifier(  
  18.                         ”com.example.myexplorer:raw/background_music”nullnull));  
  19.           
  20.         //(com.example.myexplorer.R.raw.background_music));  
  21.         Log.i(”Creat”,“successfull”);  
  22.     }  
  23.     protected void play() {  
  24.         try {  
  25.             //myMediaPlayer.prepare();   //准备并加载音频  
  26.             myMediaPlayer.start();     //开始播放音频  
  27.             Log.i(”play”,“successfull”);  
  28.         } catch (IllegalStateException e) {  
  29.             // TODO Auto-generated catch block  
  30.             e.printStackTrace();  
  31.         }   
  32.     }  
  33.     protected void stop() {  
  34.         myMediaPlayer.stop();  
  35.     }  
  36.     protected void pause() {  
  37.         myMediaPlayer.pause();  
  38.     }  
  39.     protected void release() {  
  40.         myMediaPlayer.release();  
  41.     }  
  42. }  
package com.example.myexplorer; 
import android.content.Context;
import android.media.MediaPlayer;
import android.util.Log;

public class mediaplayer {

Context context;
MediaPlayer myMediaPlayer;
public mediaplayer(Context context) {
    this.context=context;
}
protected void creatMediaPlayer() {
    Log.i("Creat","begin");
    //通过mediaPlayer的静态方法creat创建一个MediaPlayer对象
    myMediaPlayer=MediaPlayer.create(context,
            context.getResources().getIdentifier(
                    "com.example.myexplorer:raw/background_music", null, null));

    //(com.example.myexplorer.R.raw.background_music));
    Log.i("Creat","successfull");
}
protected void play() {
    try {
        //myMediaPlayer.prepare();   //准备并加载音频
        myMediaPlayer.start();     //开始播放音频
        Log.i("play","successfull");
    } catch (IllegalStateException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
}
protected void stop() {
    myMediaPlayer.stop();
}
protected void pause() {
    myMediaPlayer.pause();
}
protected void release() {
    myMediaPlayer.release();
}

}

欢迎界面WelcomeActivity的代码:

  1. package com.example.myexplorer;  
  2. import android.app.Activity;  
  3. import android.content.Intent;  
  4. import android.graphics.drawable.AnimationDrawable;  
  5. import android.os.Build;  
  6. import android.os.Bundle;  
  7. import android.view.View;  
  8. import android.view.Window;  
  9. import android.widget.LinearLayout;  
  10.   
  11. public class welcomeActivity extends Activity {  
  12.   
  13.     private AnimationDrawable ad;  
  14.     private LinearLayout ll;  
  15.     mediaplayer musicPlayer;  
  16.     @Override  
  17.     protected void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题  
  20.         setContentView(R.layout.welcome);  
  21.         ll=(LinearLayout)findViewById(R.id.ll);  
  22.         ad=(AnimationDrawable)ll.getBackground();  
  23.         musicPlayer=new mediaplayer(this);  
  24.         musicPlayer.creatMediaPlayer();   //创建一个播放器  
  25.         musicPlayer.play();                  //开始播放  
  26.         ad.start();  
  27.         new Thread(new Runnable() {  
  28.               
  29.             @Override  
  30.             public void run() {  
  31.                 // TODO Auto-generated method stub  
  32.                 try {  
  33.                     Thread.sleep(3000);  
  34.                     Intent intent =new Intent(welcomeActivity.this,MainActivity.class);  
  35.                     startActivity(intent);  
  36.                     musicPlayer.stop();  
  37.                     musicPlayer.release();  
  38.                     finish();  
  39.                 } catch (InterruptedException e) {  
  40.                     // TODO Auto-generated catch block  
  41.                     e.printStackTrace();  
  42.                 }  
  43.                   
  44.             }  
  45.         }).start();  
  46.     }  
  47.     / 
  48.       进入沉浸模式,即自动隐藏状态栏以及导航栏 
  49.       @see android.app.Activity#onWindowFocusChanged(boolean) 
  50.      /  
  51.      @Override  
  52.         public void onWindowFocusChanged(boolean hasFocus) {              //进入沉浸模式,即自动隐藏状态栏以及导航栏  
  53.             super.onWindowFocusChanged(hasFocus);  
  54.             //判断是否有焦点  
  55.             if(hasFocus && Build.VERSION.SDK_INT >= 19){  
  56.                 View decorView = getWindow().getDecorView();  
  57.                 decorView.setSystemUiVisibility(  
  58.                         View.SYSTEM_UI_FLAG_LAYOUT_STABLE  
  59.                         |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION  
  60.                         |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  
  61.                         |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION  
  62.                         |View.SYSTEM_UI_FLAG_FULLSCREEN  
  63.                         |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY  
  64.                 );  
  65.   
  66.             }  
  67.         }  
  68. }  
package com.example.myexplorer; 
import android.app.Activity;
import android.content.Intent;
import android.graphics.drawable.AnimationDrawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.widget.LinearLayout;

public class welcomeActivity extends Activity {

private AnimationDrawable ad;
private LinearLayout ll;
mediaplayer musicPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题
    setContentView(R.layout.welcome);
    ll=(LinearLayout)findViewById(R.id.ll);
    ad=(AnimationDrawable)ll.getBackground();
    musicPlayer=new mediaplayer(this);
    musicPlayer.creatMediaPlayer();   //创建一个播放器
    musicPlayer.play();                  //开始播放
    ad.start();
    new Thread(new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            try {
                Thread.sleep(3000);
                Intent intent =new Intent(welcomeActivity.this,MainActivity.class);
                startActivity(intent);
                musicPlayer.stop();
                musicPlayer.release();
                finish();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }).start();
}
/*
 * 进入沉浸模式,即自动隐藏状态栏以及导航栏
 * @see android.app.Activity#onWindowFocusChanged(boolean)
 */
 @Override
    public void onWindowFocusChanged(boolean hasFocus) {              //进入沉浸模式,即自动隐藏状态栏以及导航栏
        super.onWindowFocusChanged(hasFocus);
        //判断是否有焦点
        if(hasFocus &amp;&amp; Build.VERSION.SDK_INT &gt;= 19){
            View decorView = getWindow().getDecorView();
            decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    |View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    |View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    |View.SYSTEM_UI_FLAG_FULLSCREEN
                    |View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
            );

        }
    }

}





阅读更多

    <div class="article-bar-bottom">
                    <div class="tags-box artic-tag-box">
        <span class="label">文章标签:</span>
                    <a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=progressBar&amp;t=blog" target="_blank">progressBar                       </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=WebView&amp;t=blog" target="_blank">WebView                       </a><a class="tag-link" href="http://so.csdn.net/so/search/s.do?q=音频播放&amp;t=blog" target="_blank">音频播放                     </a>
    </div>
                    <div class="tags-box">
        <span class="label">个人分类:</span>
                    <a class="tag-link" href="https://blog.csdn.net/fdgfgfdgfd/article/category/7674392" target="_blank">安卓开发                       </a>
    </div>
                </div>

<!-- !empty($pre_next_article[0]) -->
    </div>
(".MathJax").remove();




    MathJax.Hub.Config({
            "HTML-CSS": {
                    linebreaks: { automatic: true, width: "94%container" },
                    imageFont: null
            },
            tex2jax: {
                preview: "none"
            },
            mml2jax: {
                preview: 'none'
            }
    });



    (function(){
        var btnReadmore =
(".MathJax").remove();    MathJax.Hub.Config({            "HTML-CSS": {                    linebreaks: { automatic: true, width: "94%container" },                    imageFont: null            },            tex2jax: {                preview: "none"            },            mml2jax: {                preview: 'none'            }    });    (function(){        var btnReadmore =
("#btn-readmore"); if(btnReadmore.length>0){ var winH = (window).height();vararticleBox= ( w i n d o w ) . h e i g h t ( ) ; v a r a r t i c l e B o x = ("div.article_content"); var artH = articleBox.height(); if(artH > winH*2){ articleBox.css({ 'height':winH*2+'px', 'overflow':'hidden' }) btnReadmore.click(function(){ articleBox.removeAttr("style"); $(this).parent().remove(); }) }else{ btnReadmore.parent().remove(); } } })()
scrolling="no" allowfullscreen="true" width="100%" height="162px" src="https://edu.csdn.net/sp/blog.php?type=bigdata1">
var edu_ad_is_big_data = 0; var edu_ad_id_mapping = {"0":["https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"1":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=web1"],"8":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"2":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"3":["https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1","https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"6":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"12":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"14":["https:\/\/edu.csdn.net\/sp\/blog.php?type=web1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"15":["https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1","https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"16":["https:\/\/edu.csdn.net\/sp\/blog.php?type=web1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"28":["https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"29":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"30":["https:\/\/edu.csdn.net\/sp\/blog.php?type=python1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"32":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"33":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"35":["https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1","https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"37":["https:\/\/edu.csdn.net\/sp\/blog.php?type=web1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"7":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"17":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"34":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=python1"],"36":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1","https:\/\/edu.csdn.net\/sp\/blog.php?type=ai1"],"31":["https:\/\/edu.csdn.net\/sp\/blog.php?type=python1","https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"19":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"],"20":["https:\/\/edu.csdn.net\/sp\/blog.php?type=bigdata1"]};
想对作者说点什么? 我来说一句
卖海参不能昧了良心!买海参必看!!! 中科腾宇 · 顶新
var width = $("div.recommend-box").outerWidth() - 48; NEWS_FEED({ w: width, h : 90, showid : 'GNKXx7', placeholderId: "ad1", inject : 'define', define : { imagePosition : 'right', imageBorderRadius : 0, imageWidth: 120, imageHeight: 90, imageFill : 'clip', displayImage : true, displayTitle : true, titleFontSize: 20, titleFontColor: '#333', titleFontFamily : 'Microsoft Yahei', titleFontWeight: 'bold', titlePaddingTop : 0, titlePaddingRight : 0, titlePaddingBottom : 10, titlePaddingLeft : 0, displayDesc : true, descFontSize: 14, descFontColor: '#6b6b6b', descFontFamily : 'Microsoft Yahei', paddingTop : 0, paddingRight : 0, paddingBottom : 0, paddingLeft : 0, backgroundColor: '#fff', hoverColor: '#ca0c16' } })
            <div class="recommend-item-box csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
    <h4 class="text-truncate">
        <a href="https://blog.csdn.net/jin861625788/article/details/18549547" target="_blank" strategy="BlogCommendFromQuerySearch_2">
            <em>webview</em>完成网页加载后<em>progressbar</em>自动隐藏         </a>
    </h4>
    <p class="content">
        <a href="https://blog.csdn.net/jin861625788/article/details/18549547" target="_blank">
            <em>webview</em>在加载完网页的时候自动隐藏<em>progressbar</em><em>进度条</em>网上的大多的方法是m<em>WebView</em>.setWebChromeClient(new WebChromeClient() {public...         </a>
    </p>
    <div class="info-box d-flex align-content-center">
        <p>
            <a class="avatar" src="https://blog.csdn.net/jin861625788" title="jin861625788" target="_blank">
                <img src="https://avatar.csdn.net/2/5/B/3_jin861625788.jpg" alt="jin861625788" class="avatar-pic">
                <span class="name">jin861625788</span>
            </a>
        </p>
        <p>
            <span class="date">2014-01-20 11:19:38</span>
        </p>
        <p>
            <span class="read-num">阅读数:2391</span>
        </p>
    </div>
</div>
                <div class="recommend-item-box csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
    <h4 class="text-truncate">
        <a href="https://blog.csdn.net/u014737138/article/details/51532056" target="_blank" strategy="BlogCommendFromQuerySearch_3">
            实习入职第九天:<em>MediaPlayer</em>添加<em>进度条</em>的两种方式         </a>
    </h4>
    <p class="content">
        <a href="https://blog.csdn.net/u014737138/article/details/51532056" target="_blank">
            1.<em>使用</em>handler做:

Handler handler = new Handler();
Runnable updateThread = new Runnable() {
    publi...            </a>
    </p>
    <div class="info-box d-flex align-content-center">
        <p>
            <a class="avatar" src="https://blog.csdn.net/u014737138" title="u014737138" target="_blank">
                <img src="https://avatar.csdn.net/A/F/F/3_u014737138.jpg" alt="u014737138" class="avatar-pic">
                <span class="name">u014737138</span>
            </a>
        </p>
        <p>
            <span class="date">2016-05-29 14:51:18</span>
        </p>
        <p>
            <span class="read-num">阅读数:550</span>
        </p>
    </div>
</div>
                <div class="recommend-item-box csdn-tracking-statistics" data-mod="popu_387" data-poputype="feed" data-feed-show="false" data-dsm="post">
    <h4 class="text-truncate">
        <a href="https://blog.csdn.net/qq_29772355/article/details/67632792" target="_blank" strategy="BlogCommendFromQuerySearch_4">
             Android开发高级组件--<em>ProgressBar</em>(<em>进度条</em>组件)            </a>
    </h4>
    <p class="content">
        <a href="https://blog.csdn.net/qq_29772355/article/details/67632792" target="_blank">
            1、<em>进度条</em>组件<em>ProgressBar</em>是在某些操作的进度发展情况指示器,为用户呈现操作的进度,操作完成后<em>进度条</em>被填满。<em>进度条</em>能够直观的帮助用户了解等待一定时间的操作所需要的时间。

2、其层次结构如下:…





qq_29772355
qq_29772355



2017-03-28 10:36:33



阅读数:287








https://s3m.mediav.com/galileo/547901-e34aae1a025eae11b7c4597781bbd17c.jpg)”>


怎么去除耳鸣?告诉你一个非常不错的小窍门!
素显 · 顶新






var width = $("div.recommend-box").outerWidth() - 48;
NEWS_FEED({
w: width,
h: 90,
showid: 'Afihld',
placeholderId: 'a_d_feed_0',
inject: 'define',
define: {
imagePosition: 'right',
imageBorderRadius: 0,
imageWidth: 120,
imageHeight: 90,
imageFill: 'clip',
displayImage: true,
displayTitle: true,
titleFontSize: 20,
titleFontColor: '#333',
titleFontFamily: 'Microsoft Yahei',
titleFontWeight: 'bold',
titlePaddingTop: 0,
titlePaddingRight: 0,
titlePaddingBottom: 10,
titlePaddingLeft: 0,
displayDesc: true,
descFontSize: 14,
descFontColor: '#6b6b6b',
descFontFamily: 'Microsoft Yahei',
paddingTop: 0,
paddingRight: 0,
paddingBottom: 0,
paddingLeft: 0,
backgroundColor: '#fff',
hoverColor: '#ca0c16'
}
})







Android程序:进度条ProgressBar)的使用方法和案例




基本用法:

MainActivity :public class MainActivity extends Activity implements OnClickListener { …





li90031
li90031



2015-04-23 18:32:06



阅读数:3021







scrolling="no">





id="iframeu3394176_0" src="https://pos.baidu.com/ecnm?conwid=800&conhei=100&rdid=3394176&dc=3&di=u3394176&dri=0&dis=0&dai=1&ps=5416x343&enu=encoding&dcb=___adblockplus&dtm=HTML_POST&dvi=0.0&dci=-1&dpt=none&tsr=0&tpr=1528357679578&ti=%E5%AE%89%E5%8D%93%E5%BC%80%E5%8F%91%E4%B9%8BWebView%EF%BC%8C%E8%BF%9B%E5%BA%A6%E6%9D%A1ProgressBar%E4%BB%A5%E5%8F%8AMediaPlayer%E5%92%8CSonundPool%E7%9A%84%E4%BD%BF%E7%94%A8%20-%20CSD&ari=2&dbv=2&drs=3&pcs=1903x960&pss=1903x5489&cfv=0&cpl=11&chi=1&cce=true&cec=UTF-8&tlm=1528357679&prot=2&rw=960&ltu=https%3A%2F%2Fblog.csdn.net%2FFDGFGFDGFD%2Farticle%2Fdetails%2F80594872&ltr=https%3A%2F%2Fwww.csdn.net%2Fnav%2Fmobile&ecd=1&uc=1920x1050&pis=-1x-1&sr=1920x1080&tcn=1528357680&qn=7b8d30ebab677261&tt=1528357678741.840.841.843" width="800" height="100" align="center,center" vspace="0" hspace="0" scrolling="no">



自定义 ProgressBar 进度条 自定义样式




今天学习给ProgressBar换个样式,先看效果图:, c) H, E- d8 Z! F( j% X

原理:在XML文件中分别定义进度条背景、第一进度颜色、第二进度颜色,然后在Progress…





daditao
daditao



2014-06-20 14:38:47



阅读数:2453









没有更多推荐了,返回首页




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值