亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android實現長圖文截圖功能實例代碼

2019-10-21 21:35:58
字體:
來源:轉載
供稿:網友

前言

截圖是我們日常開發經常會遇到的一個功能,最近工作遇到的需求又升級了,需要實現長圖文的截圖功能,經常查找相關資料終于實現了,支持截取微博、知乎、今日頭條等第三方APP......

先瞅瞅效果圖:

Android,長圖文,截圖,代碼
效果圖

再瞅瞅最終的長截圖:

我是長截圖一,瞅瞅嘛...

我是長截圖二,再瞅一下嘛...

上一周腦子突然冒出長截圖這個功能,想著如何截取如微博,知乎,頭條等這些第三方APP的界面呢?出于好奇心,花了一周業余時間,擼一個看看。

不就是截屏+拼圖,還能有什么難度么?這個。。。好像確實是。

Question:

1.如何截屏?

Android 5.0 API 21之前,想要系統截屏,是需要root,不過Android 5.0開始開放了響應的截屏接口:

MediaProjection (added in API level 21.)

A token granting applications the ability to capture screen contents and/or record system audio. The exact capabilities
granted depend on the type of MediaProjection.

2.如何優雅的截圖?

懸浮窗那么小,難道每次我都得滑一定的距離,然后點一次懸浮窗么,理論上可以,但體驗不好。估計更多人傾向只要觸摸屏幕就可以截圖,所以選擇監聽懸浮窗外的觸屏事件。

3.如何監聽懸浮窗口外部的TouchEvent?

懸浮窗外的觸屏事件都已經脫離整個應用了,如何監聽呢?這里確實卡了些時間,因為確實找不到如何捕獲這個事件的好,我感覺這個問題也是最煩的一個,后來來了點靈感,我設置一個全屏的透明背景,然后給這個背景設置onTouch事件,哦?。?!恍然大悟,以為這樣就可以了?錯?。∵@樣會出現整個手機的事件都將被這個透明背景攔截,無法傳遞到手機桌面,如果非開發人員安裝了這個軟件。。,告訴他,重新開機吧。。。所以翻了下WindowManager的源碼,看到flag參數,把各種flag參數的注釋看了遍,最后定位在如下幾個flag參數值上。

  /** Window flag: this window won't ever get key input focus, so the   * user can not send key or other button events to it. Those will   * instead go to whatever focusable window is behind it. This flag   * will also enable {@link #FLAG_NOT_TOUCH_MODAL} whether or not that   * is explicitly set.   *   * <p>Setting this flag also implies that the window will not need to   * interact with   * a soft input method, so it will be Z-ordered and positioned   * independently of any active input method (typically this means it   * gets Z-ordered on top of the input method, so it can use the full   * screen for its content and cover the input method if needed. You   * can use {@link #FLAG_ALT_FOCUSABLE_IM} to modify this behavior. */  public static final int FLAG_NOT_FOCUSABLE  = 0x00000008;  /** Window flag: this window can never receive touch events. */  public static final int FLAG_NOT_TOUCHABLE  = 0x00000010;  /** Window flag: even when this window is focusable (its   * {@link #FLAG_NOT_FOCUSABLE} is not set), allow any pointer events   * outside of the window to be sent to the windows behind it. Otherwise   * it will consume all pointer events itself, regardless of whether they   * are inside of the window. */  public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;  /** Window flag: if you have set {@link #FLAG_NOT_TOUCH_MODAL}, you   * can set this flag to receive a single special MotionEvent with   * the action   * {@link MotionEvent#ACTION_OUTSIDE MotionEvent.ACTION_OUTSIDE} for   * touches that occur outside of your window. Note that you will not   * receive the full down/move/up gesture, only the location of the   * first down as an ACTION_OUTSIDE.   */  public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;

在全屏透明背景的環境下,本以為可以監聽桌面的Down、Move、Up事件,但是出現事件全部被攔截死在這個透明背景上,無法傳到手機桌面,再發現組合這些參數,總結這種思路不可取。

查看注釋可以知道設置FLAG_WATCH_OUTSIDE_TOUCH可以在窗口外部(即App外部)接收一個指定事件MotionEvent#ACTION_OUTSIDE,但同時,你將無法接收到任何的Down、Move、Up事件。所以,也只能這樣了。。有其它高招的兄弟指點下哈。

4.如何控制截屏頻次?

在步驟3的基礎上,基本可以做一個截圖策略了,比如,每接收一次ACTION_OUTSIDE就截一次圖,又或者,每次監聽一次ACTION_OUTSIDE,就進行一次計數器的累加,為了保證截圖能承上啟下連貫,可以設置閾值為2這樣。

5.如何拼圖?

這里因人而異了,但目的都一樣,將上述步驟所截的圖對比出不同的地方,然后把不同的地方拼接起來。出于運算效率考慮,這里我是用JNI來實現的,主函數:

JNIEXPORT void JNICALL Java_com_zfw_screenshot_utils_SewUtils_merge(  JNIEnv *env, jobject thiz, jobject bmp0, jobject bmp1, jobject bmp2, int h0, int h1, int h2, int samePart, int len) { int *pixels_0 = lockPixel(env, bmp0); int *pixels_1 = lockPixel(env, bmp1); int *pixels_2 = lockPixel(env, bmp2); /* -------------------- merge the difference ----------------------- */ int index = 0; while(index < h0) {  if(index < h1) {   getRowPixels(pixels_0, index, pixels_1, index, len);  } else {   getRowPixels(pixels_0, index, pixels_2, index - h1 + samePart, len);  }  index++; } /* -------------------- merge the difference ----------------------- */ unlockPixel(env, bmp0); unlockPixel(env, bmp1); unlockPixel(env, bmp2);}

功能實現上沒什么難度,感覺更多的是得選好實現的策略,比如如何優雅的監聽懸浮窗外的Touch事件,如何優雅的實現一個“定點”截圖的策略,如何優雅的對比兩個Bitmap的不同地方,進行拼接。

源碼傳送門:https://github.com/zengfw/LongScreenShot

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網的支持。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
www亚洲欧美| 久久99久久久久久久噜噜| 日韩av网址在线观看| 国产成人综合一区二区三区| 国产精品老女人精品视频| 国产一区私人高清影院| 亚洲伊人一本大道中文字幕| 91禁外国网站| www.日韩欧美| 日韩免费av一区二区| 欧美美女18p| 久久影院模特热| 日韩av在线免播放器| 日韩av在线免费看| 91免费欧美精品| 日韩精品中文字幕久久臀| 538国产精品一区二区免费视频| 日韩成人免费视频| 一区二区三区视频免费在线观看| 日韩禁在线播放| 欧美精品videofree1080p| 92看片淫黄大片看国产片| 亚洲一区二区久久久久久久| 日韩高清av在线| 日韩精品极品视频免费观看| 成人午夜小视频| 精品国产91久久久| 成人免费视频xnxx.com| 国产精品欧美日韩| 久久精品电影网| 精品露脸国产偷人在视频| 色婷婷av一区二区三区在线观看| 夜色77av精品影院| 在线观看日韩www视频免费| 日韩电影中文 亚洲精品乱码| 午夜精品三级视频福利| 久久影院在线观看| 久久久久久久久久久免费精品| 久久久99久久精品女同性| 欧美亚州一区二区三区| 精品人伦一区二区三区蜜桃免费| 久久久亚洲网站| 亚洲美女久久久| 色av中文字幕一区| 亚洲欧美一区二区三区在线| 亚洲色图在线观看| 国产精品男人的天堂| 国产精品视频内| 全亚洲最色的网站在线观看| 久热精品视频在线观看| 不卡中文字幕av| 成人精品久久av网站| 日本国产高清不卡| 亚洲免费av电影| 亚洲影影院av| 亚洲一区亚洲二区| 久久久久亚洲精品国产| 97香蕉超级碰碰久久免费软件| 992tv成人免费视频| 久久国产天堂福利天堂| 国产精品久久久久久久久影视| 68精品国产免费久久久久久婷婷| 久久亚洲精品一区二区| 中文字幕av一区二区三区谷原希美| 久久99国产综合精品女同| 亚洲一区二区在线| 欧美多人爱爱视频网站| 国产成人avxxxxx在线看| 欧美日韩国产中文精品字幕自在自线| 久久在线精品视频| 久久久久久久久久久久av| 最近中文字幕日韩精品| 国产a级全部精品| 欧美日韩福利在线观看| 91视频88av| 久色乳综合思思在线视频| 55夜色66夜色国产精品视频| 欧美在线日韩在线| 日韩精品免费一线在线观看| 久久精品青青大伊人av| 一区国产精品视频| 中文字幕v亚洲ⅴv天堂| 欧美精品一二区| 伊是香蕉大人久久| 亚洲视频999| www.精品av.com| 亚洲国语精品自产拍在线观看| 日韩精品极品视频| 亚洲女人天堂av| 亚洲系列中文字幕| 国产日韩在线看片| 欧美区二区三区| 亚洲电影中文字幕| 91在线免费看网站| 国产精品视频永久免费播放| 亚洲在线视频福利| 欧美丝袜美女中出在线| 日韩专区在线播放| 久操成人在线视频| 国产亚洲一区二区精品| 91夜夜揉人人捏人人添红杏| 国产精品久久久久影院日本| 久久久久日韩精品久久久男男| 一本色道久久综合狠狠躁篇怎么玩| 亚洲国产日韩欧美在线图片| 国产999在线观看| 国内免费精品永久在线视频| 亚洲男人天堂手机在线| 欧美老女人xx| 成人欧美一区二区三区在线| 亚洲欧美成人一区二区在线电影| 欧美理论电影网| 日韩极品精品视频免费观看| 91视频免费在线| 亚洲一区二区三区xxx视频| 国产欧美日韩精品丝袜高跟鞋| 国产精品成人观看视频国产奇米| 久久久亚洲国产天美传媒修理工| 日韩欧美极品在线观看| 久久久国产精品亚洲一区| 日韩电影在线观看永久视频免费网站| www.亚洲免费视频| 欧美一级大片在线免费观看| 精品亚洲夜色av98在线观看| 日韩av手机在线| www.日韩.com| 久久久久久成人精品| 国产啪精品视频网站| 欧美激情精品久久久久久免费印度| 日韩成人黄色av| 草民午夜欧美限制a级福利片| 成人精品视频99在线观看免费| 久久久久久久一区二区三区| 欧美午夜xxx| 91中文精品字幕在线视频| 国产精品久久久久久超碰| 午夜精品久久久99热福利| 啊v视频在线一区二区三区| 91高清在线免费观看| 国产97色在线| 中文字幕亚洲无线码a| 久久久国产一区二区| 国产99久久久欧美黑人| 成人国产精品日本在线| 精品视频在线播放色网色视频| 亚洲欧美激情另类校园| 国产va免费精品高清在线| 91精品国产91久久久久久最新| 俺去了亚洲欧美日韩| 精品国产一区二区在线| 色哟哟入口国产精品| 中文字幕亚洲图片| 国产精品露脸自拍| 日本a级片电影一区二区| 日本韩国在线不卡| 国产精品日韩一区| 欧美午夜丰满在线18影院| 国产成人亚洲精品| 亚洲国产精久久久久久| 亚洲第一视频在线观看| 丝袜亚洲欧美日韩综合| 国产精品久久久久久久久久99| 国产精品99蜜臀久久不卡二区| 久久色精品视频|