最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android截屏SurfaceView黑屏問題的解決辦法

 更新時間:2021年07月11日 09:46:02   作者:風二中  
這篇文章主要為大家詳細介紹了Android截屏SurfaceView黑屏問題的解決辦法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近項目中有截屏的需求,普通的view截屏方法網(wǎng)上一搜一大把,但是SurfaceView截屏黑屏問題很多文章說的并不清楚,自己參考了一些別的博客,再加上自己的思考,算是找到了一種解決方案。

1、首先看我們一般是怎么用SurfaceView的

public class SuperSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder surfaceHolder;
 
 public SuperSurfaceView(Context context) {
  super(context);
  surfaceHolder = this.getHolder();
  surfaceHolder.addCallback(this);
 }
 
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
 
 }
 
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  new Thread(new MyThread()).start();
 }
 
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
 
 }
 
 class MyThread implements Runnable {
  @Override
  public void run() {
   Canvas canvas = surfaceHolder.lockCanvas(null);//獲取畫布
   Paint mPaint = new Paint();
   mPaint.setColor(Color.BLUE);
   canvas.drawRect(new RectF(100, 100, 1000, 550), mPaint);
   surfaceHolder.unlockCanvasAndPost(canvas);//解鎖畫布,提交畫好的圖像
 
  }
 }
}

從以上代碼中,可以看到在MyThread的run方法中創(chuàng)建了一塊畫布,進行SurfaceView的繪制,但是我們知道SurfaceView是雙緩沖機制,這個Canvas上的內容我們拿不到,所以截屏出來是黑屏。所以,要拿到這個畫布上的內容,就自己創(chuàng)建一個畫布,將這些內容畫到自己的Canvas上,就可以了。

2、拿到SurfaceView畫布上的bitmap,看修改過后的代碼

public abstract class SuperSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder surfaceHolder;
 
 public SuperSurfaceView(Context context) {
  super(context);
  surfaceHolder = this.getHolder();
  surfaceHolder.addCallback(this);
 }
 
 @Override
 public void surfaceChanged(SurfaceHolder holder, int format, int width,
        int height) {
 
 }
 
 @Override
 public void surfaceCreated(SurfaceHolder holder) {
  new Thread(new MyThread()).start();
 }
 
 @Override
 public void surfaceDestroyed(SurfaceHolder holder) {
 
 }
 
 class MyThread implements Runnable {
  @Override
  public void run() {
   Canvas canvas = surfaceHolder.lockCanvas(null);//獲取畫布
   doDraw(canvas);
   surfaceHolder.unlockCanvasAndPost(canvas);//解鎖畫布,提交畫好的圖像
 
  }
 }
 
 //將繪制圖案的方法抽象出來,讓子類實現(xiàn),調用getBitmap方法時就會調用此方法
 protected abstract void doDraw(Canvas canvas);
 
 //調用該方法將doDraw繪制的圖案繪制在自己的canvas上
 public Bitmap getBitmap() {
  Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
  Canvas canvas = new Canvas(bitmap);
  doDraw(canvas);
  return bitmap;
 }
}

3、下面看MainActivity中如何使用

Button bt = (Button) findViewById(R.id.bt);
FrameLayout fl = (FrameLayout) findViewById(R.id.fl);
//用到surfaceview需繼承SuperSurfaceView才能截到屏,否則截出來是黑屏
SuperSurfaceView surfaceView = new SuperSurfaceView(this) {
 @Override
 protected void doDraw(Canvas canvas) {
  Paint mPaint = new Paint();
  mPaint.setColor(Color.BLUE);
  canvas.drawRect(new RectF(100, 100, 1000, 550), mPaint);
 }
};
fl.addView(surfaceView);
 
bt.setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
  //調用該方法即可得到surfaceview上繪制的圖案
  Bitmap bitmap = surfaceView.getBitmap();
 }
});

補充:如果界面上還有其他控件需要一起截屏,可以將截到的surfaceview的bitmap和用普通辦法截到的不含surfaceview的bitmap拼接起來就OK了,至于兩個bitmap合為一個bitmap的方法,百度一下有很多,不再贅述。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android自定義View實現(xiàn)縱向跑馬燈效果詳解

    Android自定義View實現(xiàn)縱向跑馬燈效果詳解

    對于跑馬燈效果在我們日常使用的app中還是很常見的,比如外賣app的商家公告就使用了此效果,但是它是橫向滾動的,橫向滾動多適用于單條信息;但凡涉及到多條信息的滾動展示,用縱向滾動效果會有更好的用戶體驗,今天我們通過自定義View來看看如何實現(xiàn)縱向跑馬燈效果。
    2016-11-11
  • 在RecyclerView中實現(xiàn)button的跳轉功能

    在RecyclerView中實現(xiàn)button的跳轉功能

    本次實驗就是在RecyclerView中添加一個button控件并實現(xiàn)監(jiān)聽,使鼠標點擊時可以跳轉到另外一個設計好的界面,對RecyclerView實現(xiàn)button跳轉功能感興趣的朋友一起看看吧
    2021-10-10
  • 仿iPhone風格對話框(附件包含例子/jar包/jar包源碼)

    仿iPhone風格對話框(附件包含例子/jar包/jar包源碼)

    這個對框完全繼承、仿照AlertDialog,只是實現(xiàn)了自定義效果;另外,沒有實現(xiàn)setIcon,因為iphone中的對話框多數(shù)都沒有圖標;附件包含例子、jar包、jar包源碼
    2013-01-01
  • Android手機開發(fā) 控件 TextView文字居中

    Android手機開發(fā) 控件 TextView文字居中

    本文主要介紹Android手機開發(fā)TextView居中的方法,希望能幫到大家。
    2016-05-05
  • Android自定義滑動解鎖控件使用詳解

    Android自定義滑動解鎖控件使用詳解

    這篇文章主要為大家詳細介紹了Android自定義滑動解鎖控件的使用方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Android開發(fā)之自定義View(視圖)用法詳解

    Android開發(fā)之自定義View(視圖)用法詳解

    這篇文章主要介紹了Android開發(fā)之自定義View(視圖)用法,結合實例形式分析了Android自定義視圖的實現(xiàn)方法與使用注意事項,需要的朋友可以參考下
    2016-10-10
  • Android Studio編寫AIDL文件后如何實現(xiàn)自動編譯生成

    Android Studio編寫AIDL文件后如何實現(xiàn)自動編譯生成

    這篇文章主要介紹了Android Studio編寫AIDL文件后如何實現(xiàn)自動編譯生成,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android P實現(xiàn)靜默安裝的方法示例(官方Demo)

    Android P實現(xiàn)靜默安裝的方法示例(官方Demo)

    這篇文章主要介紹了Android P實現(xiàn)靜默安裝,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-02-02
  • Flutter狀態(tài)管理Bloc使用示例詳解

    Flutter狀態(tài)管理Bloc使用示例詳解

    這篇文章主要為大家介紹了Flutter狀態(tài)管理Bloc使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Flutter使用Overlay與ColorFiltered新手引導實現(xiàn)示例

    Flutter使用Overlay與ColorFiltered新手引導實現(xiàn)示例

    這篇文章主要介紹了Flutter使用Overlay與ColorFiltered新手引導實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10

最新評論

柞水县| 汝阳县| 永济市| 景德镇市| 磐石市| 祁阳县| 禹州市| 郁南县| 神木县| 香河县| 东乡族自治县| 平武县| 阿城市| 平阳县| 鄂伦春自治旗| 永兴县| 宜昌市| 扶沟县| 航空| 原平市| 枞阳县| 商丘市| 静乐县| 界首市| 涞源县| 延庆县| 察雅县| 平江县| 利津县| 裕民县| 长治县| 满城县| 搜索| 新化县| 府谷县| 富川| 兴隆县| 合阳县| 莫力| 项城市| 玛纳斯县|