打算记录一些自己在开发过程中遇到的一些技巧性代码,就从这篇开始吧。
- 1,如何截取当前屏幕(不包括当前
Activity的Title)并分享:a,获取当前Activity的根视图:View rootView = getWindow().getDecorView().findViewById(android.R.id.content);
或者:View rootView = findViewById(android.R.id.content);
或者:View rootView = findViewById(android.R.id.content).getRootView();
关于android.R.id.content,开发者文档中并没有给予说明,但经过测试它应该是用来获取setContentView()中设置的View。
b,截取当前根视图的屏幕:public static Bitmap getScreenShot(View view) { View screenView = view.getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false); return bitmap;}
c,将当前屏幕的截屏保存至SDCard:private final static String dir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Screenshots";public static void store(Bitmap bm, String fileName){ File dir = new File(dir); if(!dir.exists()) dir.mkdirs(); File file = new File(dir, fileName); try { FileOutputStream fOut = new FileOutputStream(file); bm.compress(Bitmap.CompressFormat.PNG, 85, fOut); fOut.flush(); fOut.close(); } catch (Exception e) { e.printStackTrace(); }}
d,最后将该图片文件分享出来:private void shareImage(String file){ Uri uri = Uri.fromFile(file); Intent intent = new Intent(); intent.setAction(Intent.ACTION_SEND); intent.setType("image/*"); intent.putExtra(android.content.Intent.EXTRA_SUBJECT, ""); intent.putExtra(android.content.Intent.EXTRA_TEXT, ""); intent.putExtra(Intent.EXTRA_STREAM, uri); startActivity(Intent.createChooser(intent, "Share Screenshot"));}
- 2,如何对
HTML5中的视频截图:a,初始化WebView:String webUrl = ...; VideoView vv;mWebView = (WebView) findViewById(R.id.webview);mWebView.setWebChromeClient(chromeClient);mWebView.setWebViewClient(wvClient);mWebView.getSettings().setJavaScriptEnabled(true);mWebView.getSettings().setPluginsEnabled(true);mWebView.loadUrl(webUrl);
b,覆盖WebChromeClient中的onShowCustomView方法:@Overridepublic void onShowCustomView(View view, CustomViewCallback callback) { super.onShowCustomView(view, callback); if (view instanceof FrameLayout){ FrameLayout frame = (FrameLayout) view; if (frame.getFocusedChild() instanceof VideoView){ vv = (VideoView) frame.getFocusedChild(); } }}
c,截取VideoView中播放的视频内容:private Bitmap capture(VideoView vv){ MediaMetadataRetriever rev = new MediaMetadataRetriever(); rev.setDataSource(this, uri);//this is a Context; Bitmap bitmap = rev.getFrameAtTime(vv.getCurrentPosition() * 1000, MediaMetadataRetriever.OPTION_CLOSEST_SYNC); return bitmap;}
d,如何还想将截屏幕保存或分享,请参见上面的代码示例.
- 3,如何动态获取保存在
integer-array中的动态资源id?a,在res/values/目录下创建arrays.xml文件,创建内容如下:\integer-array\ name="frag_home_ids"\\item\@drawable/frag_home_credit_return_money\/item\\item\@drawable/frag_home_transfer\/item\\item\@drawable/frag_home_balance\/item\\item\@drawable/frag_home_charge\/item\\item\@drawable/frag_home_finance_cdd\/item\\item\@drawable/frag_home_finance_ybjr\/item\\item\@drawable/frag_home_more\/item\\/integer-array\
b,通过编码的方式获取integer-array中的资源id整型值:TypedArray tArray = getResources().obtainTypedArray(R.array.frag_home_ids);int count = tArray.length();int[] ids = new int[count];for (int i = 0; i < ids.length; i++) { ids[i] = tArray.getResourceId(i, 0);}
c,使用已经获取到的资源的id:holder.iv.setImageResource(ids[position]);
d,我们也还可以用这种方式获取string, color, integer, layout, menu等的id.
- 4,
ListView或GridView局部刷新原理的实现:private void refreshPartially(int position){ int firstVisiblePosition = listview.getFirstVisiblePosition(); int lastVisiblePosition = listview.getLastVisiblePosition(); if(position>=firstVisiblePosition && position<=lastVisiblePosition){ View view = listview.getChildAt(position - firstVisiblePosition); if(view.getTag() instanceof ViewHolder){ ViewHolder vh = (ViewHolder)view.getTag(); //holder.play.setBackgroundResource(resId);//Do something here. ... } }}
- 5,
Google Volley的单例模式实现:package me.pc.mobile.tv.util;import android.content.Context;import android.graphics.Bitmap;import android.util.LruCache;import com.android.volley.RequestQueue;import com.android.volley.toolbox.ImageLoader;import com.android.volley.toolbox.Volley;public class VolleySingleton { private static VolleySingleton instance;private RequestQueue requestQueue;private ImageLoader imageLoader;private VolleySingleton(Context context) {requestQueue = Volley.newRequestQueue(context);imageLoader = new ImageLoader(requestQueue, new ImageLoader.ImageCache() {private final LruCache@Overridepublic Bitmap getBitmap(String url) { return cache.get(url);}@Overridepublic void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap);}});}public static VolleySingleton getInstance(Context context) { if (instance == null) { instance = new VolleySingleton(context); } return instance;}public RequestQueue getRequestQueue() { return requestQueue;}public ImageLoader getImageLoader() { return imageLoader;}}
采用Volley的单例模式,就避免了在每一个Activity或Frament中都创建一个RequestQueue的麻烦.
- 6,使用
Google Volley来实现文件的分块上传:public class PhotoMultipartRequestprivate static final String FILE_PART_NAME = "file";private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();private final Response.Listenerprivate final File mImageFile;protected Mappublic PhotoMultipartRequest(String url, ErrorListener errorListener, Listener super(Method.POST, url, errorListener); mListener = listener; mImageFile = imageFile; buildMultipartEntity();}@Overridepublic Map Map if (headers == null || headers.equals(Collections.emptyMap())) { headers = new HashMap } headers.put("Accept", "application/json"); return headers;}private void buildMultipartEntity(){ mBuilder.addBinaryBody(FILE_PART_NAME, mImageFile, ContentType.create("image/jpeg"), mImageFile.getName()); mBuilder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); mBuilder.setLaxMode().setBoundary("xx").setCharset(Charset.forName("UTF-8"));}@Overridepublic String getBodyContentType(){ String contentTypeHeader = mBuilder.build().getContentType().getValue(); return contentTypeHeader;}@Overridepublic byte[] getBody() throws AuthFailureError{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { mBuilder.build().writeTo(bos); } catch (IOException e) { VolleyLog.e("IOException writing to ByteArrayOutputStream bos, building the multipart request."); } return bos.toByteArray();}@Overrideprotected Response T result = null; return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));}@Overrideprotected void deliverResponse(T response) { mListener.onResponse(response);}}
代码中使用了Apache的httpclient.jar文件,用于实现文件的拆分与上传.