该功能支持所有控件的截图,但只能截取屏幕显示部分。
1.截图功能相关的方法:
-
setDrawingCacheEnabled:设置绘图缓存的可用状态。true表示打开,false表示关闭。
-
isDrawingCacheEnabled:判断该控件的绘图缓存是否可用。
-
setDrawingCacheQuality:设置绘图缓存的质量。
-
getDrawingCache:获取该控件的绘图缓存结果,返回值为Bitmap类型。
-
setDrawingCacheBackgroundColor:设置绘图缓存的背景颜色。大家可能会奇怪为何要提供该方法,因为绘图缓存默认背景色是黑色,如果不提前设置缓存的背景色,截图的结果就是黑乎乎一片,所以需要将背景色设置为默认颜色(通常为白色)。
2.截图功能步骤
<1>开始截图前,先调用setDrawingCacheEnabled方法,设置绘图缓存为可用状态。注意该方法在一开始就得调用,因为先开启绘图缓存,之后变更的界面才会记录到缓存中;如果先变更界面再开启绘图缓存,缓存里面就是空的。
<2>调用getDrawingCache方法获取缓存中的图像数据。
<3>完成截图,延迟若干毫秒后调用setDrawingCacheEnabled方法关闭绘图缓。如果接下来还要截图,就再次调用setDrawingCacheEnabled方法重新开启绘图缓存。
3.代码示例
基于上一篇《Android聊天室或者文字直播间效果,附带TextView滚动到最下边和实时追加字符串方法》中代码进行修改
布局文件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="left|bottom"
android:layout_marginTop="100dp"
android:lines="8"
android:maxLines="8"
android:scrollbars="vertical"
android:text="快讯红色\n预警超\n强台风\n莫兰蒂\n即将\n登陆请\n居民关\n紧门窗备足粮草做好防汛救灾准备"/>
<Button
android:id="@+id/bt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="添加文字"/>
<Button
android:id="@+id/bt2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="截图"/>
<ImageView
android:id="@+id/iv"
android:layout_width="200dp"
android:layout_height="200dp"
android:scaleType="fitXY"/>
</LinearLayout>
java代码
public class MainActivity extends AppCompatActivity {
private TextView tv;
private Button bt;
private Button bt2;
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private Handler handler;
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv);
bt = findViewById(R.id.bt);
bt2 = findViewById(R.id.bt2);
iv = findViewById(R.id.iv);
handler = new Handler();
tv.setMovementMethod(new ScrollingMovementMethod());
tv.setDrawingCacheEnabled(true);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
tv.append("\n哈哈哈 "+simpleDateFormat.format(System.currentTimeMillis()));
int scrollAmount = tv.getLayout().getLineTop(tv.getLineCount())
- tv.getHeight();
if (scrollAmount > 0) {
tv.scrollTo(0, scrollAmount);
}else {
tv.scrollTo(0, 0);
}
}
});
bt2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Bitmap bitmap = tv.getDrawingCache();
iv.setImageBitmap(bitmap);
handler.postDelayed(new Runnable() {
@Override
public void run() {
tv.setDrawingCacheEnabled(false);
tv.setDrawingCacheEnabled(true);
}
},200);
}
});
}
}