zoukankan      html  css  js  c++  java
  • Android开发Tips-1

    打算记录一些自己在开发过程中遇到的一些技巧性代码,方便以后遇到相似功能时能够快速的找到,那就从这里开始吧。

    1,如何截取当前屏幕(不包括当前ActivityTitle)并分享:

    a,获取当前Activity的根视图:
     1 View rootView = getWindow().getDecorView().findViewById(android.R.id.content); 
    或者:
     1 View rootView = findViewById(android.R.id.content); 
    或者:
     1 View rootView = findViewById(android.R.id.content).getRootView(); 
    关于android.R.id.content,开发者文档中并没有给予说明,但经过测试它应该是用来获取setContentView()中设置的View
    b,截取当前根视图的屏幕:

    1 public static Bitmap getScreenShot(View view) {
    2     View screenView = view.getRootView();
    3     screenView.setDrawingCacheEnabled(true);
    4     Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
    5     screenView.setDrawingCacheEnabled(false);
    6     return bitmap;
    7 }
    getScreenShot

    c,将当前屏幕的截屏保存至SDCard:

     1 private final static String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";
     2 public static void store(Bitmap bm, String fileName){
     3     File dir = new File(dir);
     4     if(!dir.exists())
     5         dir.mkdirs();
     6     File file = new File(dir, fileName);
     7     try {
     8         FileOutputStream fOut = new FileOutputStream(file);
     9         bm.compress(Bitmap.CompressFormat.PNG, 85, fOut);
    10         fOut.flush();
    11         fOut.close();
    12     } catch (Exception e) {
    13         e.printStackTrace();
    14     }
    15 }
    store(Bitmap bm, String fileName)

    d,最后将该图片文件分享出来:

     1 private void shareImage(String file){
     2     Uri uri = Uri.fromFile(file);
     3     Intent intent = new Intent();
     4     intent.setAction(Intent.ACTION_SEND);
     5     intent.setType("image/*");
     6     intent.putExtra(android.content.Intent.EXTRA_SUBJECT, "");
     7     intent.putExtra(android.content.Intent.EXTRA_TEXT, "");
     8     intent.putExtra(Intent.EXTRA_STREAM, uri);
     9     startActivity(Intent.createChooser(intent, "Share Screenshot"));
    10 }
    shareImage(String file)

    2,如何对HTML5中的视频截图:

    a,初始化WebView:

    1 String webUrl = ...; 
    2 VideoView vv;
    3 mWebView = (WebView) findViewById(R.id.webview);
    4 mWebView.setWebChromeClient(chromeClient);
    5 mWebView.setWebViewClient(wvClient);
    6 mWebView.getSettings().setJavaScriptEnabled(true);
    7 mWebView.getSettings().setPluginsEnabled(true);
    8 mWebView.loadUrl(webUrl);
    View Code

    b,覆盖WebChromeClient中的onShowCustomView方法:

     1 @Override
     2 public void onShowCustomView(View view, CustomViewCallback callback) {
     3     super.onShowCustomView(view, callback);
     4     if (view instanceof FrameLayout){
     5         FrameLayout frame = (FrameLayout) view;
     6         if (frame.getFocusedChild() instanceof VideoView){
     7             vv = (VideoView) frame.getFocusedChild();
     8         }
     9     }
    10 }
    onShowCustomView(View view, CustomViewCallback callback)

    c,截取VideoView中播放的视频内容:

    1 private Bitmap capture(VideoView vv){
    2     MediaMetadataRetriever rev = new MediaMetadataRetriever();
    3     rev.setDataSource(this, uri);//this is a Context; 
    4     Bitmap bitmap = rev.getFrameAtTime(vv.getCurrentPosition() * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC);
    5     return bitmap;
    6 }
    capture(VideoView vv)

    d,如何还想将截屏幕保存或分享,请参见上面的代码示例.

    3,如何动态获取保存在integer-array中的动态资源id?

    a,在res/values/目录下创建arrays.xml文件,创建内容如下:

    1 <integer-array name="frag_home_ids">
    2     <item>@drawable/frag_home_credit_return_money</item>
    3     <item>@drawable/frag_home_transfer</item>
    4     <item>@drawable/frag_home_balance</item>
    5     <item>@drawable/frag_home_charge</item>
    6     <item>@drawable/frag_home_finance_cdd</item>
    7     <item>@drawable/frag_home_finance_ybjr</item>
    8     <item>@drawable/frag_home_more</item>
    9 </integer-array>
    arrays.xml

    b,通过编码的方式获取integer-array中的资源id整型值:

    1 TypedArray tArray = getResources().obtainTypedArray(R.array.frag_home_ids);
    2 int count = tArray.length();
    3 int[] ids = new int[count];
    4 for (int i = 0; i < ids.length; i++) {
    5     ids[i] = tArray.getResourceId(i, 0);
    6 }
    View Code

    c,使用已经获取到的资源的id:
     1 holder.iv.setImageResource(ids[position]); 
    d,我们也还可以用这种方式获取stringcolorintegerlayoutmenu等的id.

    4,ListViewGridView局部刷新原理的实现:

     1 private void refreshPartially(int position){
     2     int firstVisiblePosition = listview.getFirstVisiblePosition();
     3     int lastVisiblePosition = listview.getLastVisiblePosition();
     4     if(position>=firstVisiblePosition && position<=lastVisiblePosition){
     5         View view = listview.getChildAt(position - firstVisiblePosition);
     6         if(view.getTag() instanceof ViewHolder){
     7             ViewHolder vh = (ViewHolder)view.getTag();
     8             //holder.play.setBackgroundResource(resId);//Do something here.
     9             ...
    10         }
    11     }
    12 }
    refreshPartially(int position)

    5,Google Volley的单例模式实现:

     1 package me.pc.mobile.tv.util;
     2 
     3 import android.content.Context;
     4 import android.graphics.Bitmap;
     5 import android.util.LruCache;
     6 import com.android.volley.RequestQueue;
     7 import com.android.volley.toolbox.ImageLoader;
     8 import com.android.volley.toolbox.Volley;
     9 
    10 public class VolleySingleton {    
    11     private static VolleySingleton instance;
    12     private RequestQueue requestQueue;
    13     private ImageLoader imageLoader;
    14     private VolleySingleton(Context context) {
    15         requestQueue = Volley.newRequestQueue(context);
    16         imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {
    17             private final LruCache<string, bitmap=""> cache = new LruCache<string, bitmap="">(20);
    18 
    19             @Override
    20             public Bitmap getBitmap(String url) {
    21                 return cache.get(url);
    22             }
    23 
    24             @Override
    25             public void putBitmap(String url, Bitmap bitmap) {
    26                 cache.put(url, bitmap);
    27             }
    28         });
    29         }
    30 
    31     public static VolleySingleton getInstance(Context context) {
    32         if (instance == null) {
    33             instance = new VolleySingleton(context);
    34         }
    35         return instance;
    36     }
    37 
    38     public RequestQueue getRequestQueue() {
    39         return requestQueue;
    40     }
    41 
    42     public ImageLoader getImageLoader() {
    43         return imageLoader;
    44     }
    45 }
    VolleySingleton.java

    采用Volley的单例模式,就避免了在每一个ActivityFrament中都创建一个RequestQueue的麻烦.

    6,使用Google Volley来实现文件的分块上传:

     1 public class PhotoMultipartRequest extends Request {
     2 
     3     private static final String FILE_PART_NAME = "file";
     4 
     5     private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
     6     private final Response.Listener mListener;
     7     private final File mImageFile;
     8     protected Map<string, string=""> headers;
     9 
    10     public PhotoMultipartRequest(String url, ErrorListener errorListener, Listener listener, File imageFile){
    11         super(Method.POST, url, errorListener);
    12 
    13         mListener = listener;
    14         mImageFile = imageFile;
    15 
    16         buildMultipartEntity();
    17     }
    18 
    19     @Override
    20     public Map<string, string=""> getHeaders() throws AuthFailureError {
    21         Map<string, string=""> headers = super.getHeaders();
    22 
    23         if (headers == null || headers.equals(Collections.emptyMap())) {
    24             headers = new HashMap<string, string="">();
    25         }
    26 
    27         headers.put("Accept", "application/json");
    28 
    29         return headers;
    30     }
    31 
    32     private void buildMultipartEntity(){
    33         mBuilder.addBinaryBody(FILE_PART_NAME, mImageFile, ContentType.create("image/jpeg"), mImageFile.getName());
    34         mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE);
    35          mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));
    36     }
    37 
    38     @Override
    39     public String getBodyContentType(){
    40         String contentTypeHeader = mBuilder.build().getContentType().getValue();
    41         return contentTypeHeader;
    42     }
    43 
    44     @Override
    45     public byte[] getBody() throws AuthFailureError{
    46         ByteArrayOutputStream bos = new ByteArrayOutputStream();
    47         try {
    48             mBuilder.build().writeTo(bos);
    49         } catch (IOException e) {
    50             VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request.");
    51         }
    52 
    53         return bos.toByteArray();
    54     }
    55 
    56     @Override
    57     protected Response parseNetworkResponse(NetworkResponse response) {
    58         T result = null;
    59         return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
    60     }
    61 
    62     @Override
    63     protected void deliverResponse(T response) {
    64         mListener.onResponse(response);
    65     }
    66 }            
    PhotoMultipartRequest.java

    代码中使用了Apachehttpclient.jar文件,用于实现文件的拆分与上传.

    点击查看原文.

  • 相关阅读:
    关于框架
    如何理解scrapy Selector
    Excel表格如何设置密码 Excel2003/2007/2010设置密码教程
    windows 下 iptables
    学习使用windows下类似iptables的防火墙软件
    看懂SqlServer查询计划
    SQL Server 2008如何创建定期自动备份任务
    開啟活動監視器 (SQL Server Management Studio)
    CentOS 6.5安全加固及性能优化
    Linux系统部署规范v1.0
  • 原文地址:https://www.cnblogs.com/littlepanpc/p/4506294.html
Copyright © 2011-2022 走看看