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

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;
}

getScreenShot

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();
}
}

store(Bitmap bm, String fileName)

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"));
}

shareImage(String file)

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方法:

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

onShowCustomView(View view, CustomViewCallback callback)

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;
}

capture(VideoView vv)

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>

arrays.xml

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.
...
}
}
}

refreshPartially(int position)

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<string, bitmap=""> cache = new LruCache<string, bitmap="">(20); @Override
public Bitmap getBitmap(String url) {
return cache.get(url);
} @Override
public 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;
}
}

VolleySingleton.java

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

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

 public class PhotoMultipartRequest extends Request {

     private static final String FILE_PART_NAME = "file";

     private MultipartEntityBuilder mBuilder = MultipartEntityBuilder.create();
private final Response.Listener mListener;
private final File mImageFile;
protected Map<string, string=""> headers; public PhotoMultipartRequest(String url, ErrorListener errorListener, Listener listener, File imageFile){
super(Method.POST, url, errorListener); mListener = listener;
mImageFile = imageFile; buildMultipartEntity();
} @Override
public Map<string, string=""> getHeaders() throws AuthFailureError {
Map<string, string=""> headers = super.getHeaders(); if (headers == null || headers.equals(Collections.emptyMap())) {
headers = new HashMap<string, string="">();
} 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"));
} @Override
public String getBodyContentType(){
String contentTypeHeader = mBuilder.build().getContentType().getValue();
return contentTypeHeader;
} @Override
public 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();
} @Override
protected Response parseNetworkResponse(NetworkResponse response) {
T result = null;
return Response.success(result, HttpHeaderParser.parseCacheHeaders(response));
} @Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
}

PhotoMultipartRequest.java

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

点击查看原文.

Android开发Tips-1的更多相关文章

  1. Android开发Tips(2)

    欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 上一篇. 1. Dagger2的开发顺序 Module -> Component -&g ...

  2. Android开发Tips(5)

    欢迎Follow我的GitHub, 关注我的CSDN. 介绍关于Android的一些有趣的小知识点. 本文是第五篇了, 差点儿一周一篇, 欢迎阅读. 其余第一篇, 第二篇, 第三篇, 第四篇. 1. ...

  3. Android开发Tips(3)

    欢迎Follow我的GitHub, 关注我的CSDN. 我会介绍关于Android的一些有趣的小知识点. 本文是第三篇, 其余第一篇, 第二篇. imageMogr2/auto-orient/stri ...

  4. [Android开发Tips]Bean的定义

    Bean: public class Data extends BaseBean { public ArrayList<DataItem> data = new ArrayList< ...

  5. Android开发环境的演变

    之前安装过eclipse,给我的感觉是,好生麻烦.刚开始自己装花了好多时间.隐约还记得有两个小tips: 1)打开时出现 “failed to load the JNI shared library ...

  6. Android开发学习---使用Intelij idea 13.1 进行android 开发

    1.为什么放弃eclipse?太卡!! 实在受不了eclipse的卡了,运行WEB项目还好,但android开发实在太慢,太慢!经常卡死,CPU经常被占满! 看网上很多人都说比Intelij idea ...

  7. 推荐一些顶级的Android开发书籍(转)

    本帖对Android开发菜鸟和中级老兵同样适用,因为本帖重点列出了那些最常用的Android开发资源. 推荐书籍 你或许觉得,都现在了,再去看个什么书来学习Android开发,这方法应该早就过时了.没 ...

  8. Android开发环境--eclipse和Android Studio

    一.eclipse下载.安装.配置 因为eclipse是之前就下载过的,现在只能大概说一下eclipse的下载安装过程. 1.下载jdk,配置java环境变量  (1)在官网(http://www.o ...

  9. [Xamarin.Android] ActionBar Tips

    [Xamarin.Android] ActionBar Tips ActionBar用途 快速搞懂 ActionBar的用途,可以参考下列文章: [Android]使用 ActionBarCompat ...

  10. [Xamarin.Android] Fragment Tips

    [Xamarin.Android] Fragment Tips Fragment用途 快速搞懂 Fragment的用途,可以参考下列文章: Android Fragment 使用心得 Android ...

随机推荐

  1. 从源码看Android中sqlite是怎么读DB的(转)

    执行query 执行SQLiteDatabase类中query系列函数时,只会构造查询信息,不会执行查询. (query的源码追踪路径) 执行move(里面的fillwindow是真正打开文件句柄并分 ...

  2. obj-c编程04:类的继承

    这第4篇内容比較少,主要说的是obj-c中的类的继承,须要说明的是我仅仅是写了继承中最简单的形式,假设所有展开来说,那就多了去了!关键是如今肚子里还没装够墨水,没法展开啊! 以下的代码中,我们写了2个 ...

  3. zoj 2402 - Lenny&#39;s Lucky Lotto Lists

    称号:序列,在前面的每个元件的至少两倍,最大值至n.问:长l船舶有许多这样的. 分析:dp,LIS类别似事. 状态:f(i,j)结束数字为j且长度为i的序列的个数.有转移方程: F[ i ][ j ] ...

  4. 最少换乘(Dijkstra)

    Description 欧洲某城是一个著名的旅游胜地,每年都有成千上万的人前来观光旅行.Dr. Kong决定利用暑假好好游览一番.. 年轻人旅游不怕辛苦,不怕劳累,只要费用低就行.但Dr. Kong年 ...

  5. .pb.h:9:42: fatal error: google/protobuf/stubs/common.h: No such file or directory

    看看这个你应该知道,找不到头文件,它可用于g++ 的-I 参数: -I/usr/local/lib/protobuf/include如需订购g++在/usr/local/lib/protobuf 以上 ...

  6. jquery中DOM的操作方法

    先介绍几个比较简单的方法,不经常用到,做个记录 1. filter() 方法 顾名思义,filter是一个过滤器,如果给定表示 DOM 元素集合的 jQuery 对象,.filter() 方法会用匹配 ...

  7. PowerDesigner设置

    sql语句中表名与字段名前的引号去除: 打开cdm的情况下,进入Tools-Model Options-Naming Convention,把Name和Code的标签的Charcter case选项设 ...

  8. 雅居乐在核心产品 &quot;决策&quot;

    2015.6.2 在武汉-- 这是一支谦卑且认真学习,又实实在在做产品的 "产品级敏捷团队". "产品级敏捷团队"--在产品版本号开发的生命周期中.均能共同高效 ...

  9. CSharp设计模式读书笔记(11):外观模式(学习难度:★☆☆☆☆,使用频率:★★★★★)

    定义: 外观模式:为子系统中的一组接口提供一个统一的入口.外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 模式角色与结构: 示例代码: using System; using Sys ...

  10. 位记录——Windows 7已安装Sublime Text 3、cynwin、SublimeClang

    转载请注明出处:http://blog.csdn.net/cywosp/article/details/34429697 1. 到https://www.cygwin.com/下载setup-x86_ ...