欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android利用RenderScript實(shí)現(xiàn)毛玻璃模糊效果示例

 更新時(shí)間:2017年03月09日 11:30:59   作者:Melodyxxx  
毛玻璃效果(亦稱磨砂效果),近兩年在移動(dòng)端的UI設(shè)計(jì)上越來(lái)越流行,下面這篇文章主要介紹了Android利用RenderScript實(shí)現(xiàn)毛玻璃模糊效果的相關(guān)資料,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。

RenderScript 介紹

在開始之前,先看下 RenderScript 的官方介紹

RenderScript is a framework for running computationally intensive tasks at high performance on Android. RenderScript is primarily oriented for use with data-parallel computation, although serial workloads can benefit as well. The RenderScript runtime parallelizes work across processors available on a device, such as multi-core CPUs and GPUs. This allows you to focus on expressing algorithms rather than scheduling work. RenderScript is especially useful for applications performing image processing, computational photography, or computer vision.

大致意思就是說(shuō) RenderScript 是 Android 平臺(tái)上為了計(jì)算密集型任務(wù)的一中高性能框架,并且RenderScript 尤其對(duì)圖像的處理特別有用。另外,RenderScript 之所以效率高是因?yàn)槠涞讓邮?C 實(shí)現(xiàn)的。

使用 RenderScript Support Library

為了可以兼容到更早的版本,我們直接使用 android.support.v8.renderscript(支持API level 9+)包下的,而不使用android.renderscript(支持API level 11+)

以 Android Studio 為例,打開你的 app 的 build.gradle 文件,在 android 的 defaultConfig 結(jié)點(diǎn)添加兩句:

renderscriptTargetApi 18
renderscriptSupportModeEnabled true

其中 renderscriptTargetApi 的值官方說(shuō)的是從 11 到最新的 API Level 都可以

這樣我們等下導(dǎo)包就可以導(dǎo) v8 內(nèi)的了。

模糊背景

局部模糊

先上一張我們要實(shí)現(xiàn)的效果圖:

這里可以看到實(shí)現(xiàn)的是局部模糊,在圖片的正中間有一個(gè) TextView,TextView 的背景部分做了模糊處理。

先大致說(shuō)下模糊的主要步驟(完全模糊步驟一樣):

  1. 首先取出 TextView 在 ImageView 正上方處的那一塊背景
  2. 然后對(duì)取出的那一塊背景做模糊處理
  3. 最后把模糊處理后的背景再設(shè)為 TextView 的背景

這樣,就可以達(dá)到我們圖片中的局部模糊效果,具體的過程在代碼中有詳細(xì)的注釋。

下面先貼上布局文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:padding="20dp">

 <FrameLayout
  android:layout_width="300dp"
  android:layout_height="300dp"
  android:layout_centerInParent="true">

  <ImageView
   android:id="@+id/image"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:scaleType="centerCrop"
   android:src="@drawable/img"/>

  <TextView
   android:id="@+id/text"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_gravity="center"
   android:text="Melody"
   android:textColor="@android:color/white"
   android:textSize="45sp"/>

 </FrameLayout>

</RelativeLayout>

再貼上java代碼:

public class MainActivity extends Activity implements Runnable {

 private static final String TAG = "MainActivity";

 private ImageView mImage;
 private TextView mText;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  mImage = (ImageView) findViewById(R.id.image);
  mText = (TextView) findViewById(R.id.text);
  // onCreate()內(nèi)無(wú)法到ImageView的背景,所以需要 post 到消息隊(duì)列內(nèi)稍后執(zhí)行
  mImage.post(this);
 }

 @Override
 public void run() {
  blur(getImageViewBitmap(mImage), mText);
 }

 /**
  * 取出一個(gè)imageView的bitmap背景
  */
 public Bitmap getImageViewBitmap(ImageView imageView) {
  imageView.setDrawingCacheEnabled(true);
  // 取出ImageView的Bitmap
  Bitmap bitmap = imageView.getDrawingCache();
  // 拷貝一份bitmap用作模糊
  Bitmap bitmapCopy = bitmap.copy(bitmap.getConfig(), true);
  imageView.setDrawingCacheEnabled(false);
  return bitmapCopy;
 }

 /**
  * 模糊的具體實(shí)現(xiàn)
  *
  * @param inputBitmap 要模糊的 bitmap
  * @param targetView 需要被模糊背景的 View
  */
 public void blur(Bitmap inputBitmap, View targetView) {
  // 創(chuàng)建一個(gè)和目標(biāo)View(需要背景被模糊的View)寬高一樣的空的 outputBitmap
  Bitmap outputBitmap = Bitmap.createBitmap((int) (targetView.getMeasuredWidth()),
    (int) (targetView.getMeasuredHeight()), Bitmap.Config.ARGB_8888);
  // 將 outputBitmap 關(guān)聯(lián)在 canvas 上
  Canvas canvas = new Canvas(outputBitmap);
  // 畫布移動(dòng)到目標(biāo) View 在父布局中的位置
  canvas.translate(-targetView.getLeft(), -targetView.getTop());
  Paint paint = new Paint();
  paint.setFlags(Paint.FILTER_BITMAP_FLAG);
  // 將要模糊的 inputBitmap 繪制到 outputBitmap 上
  // 因?yàn)閯偛抛隽?translate 操作,這樣就可以裁剪到目標(biāo) View 在父布局內(nèi)的那一塊背景到 outputBitmap 上
  canvas.drawBitmap(inputBitmap, 0, 0, paint);

  // ----接下來(lái)做模糊 outputBitmap 處理操作----

  // 創(chuàng)建 RenderScript
  RenderScript rs = RenderScript.create(this);
  Allocation input = Allocation.createFromBitmap(rs, outputBitmap);
  Allocation output = Allocation.createTyped(rs, input.getType());
  // 使用 ScriptIntrinsicBlur 類來(lái)模糊圖片
  ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(
    rs, Element.U8_4(rs));
  // 設(shè)置模糊半徑 ( 取值范圍為( 0.0f , 25f ] ,半徑越大,模糊效果也越大)
  blur.setRadius(25f);
  blur.setInput(input);
  // 模糊計(jì)算
  blur.forEach(output);
  // 模糊 outputBitmap
  output.copyTo(outputBitmap);
  // 將模糊后的 outputBitmap 設(shè)為目標(biāo) View 的背景
  targetView.setBackground(new BitmapDrawable(getResources(), outputBitmap));
  rs.destroy();
 }

}

導(dǎo)的是 v8 的包:

import android.support.v8.renderscript.Allocation;
import android.support.v8.renderscript.Element;
import android.support.v8.renderscript.RenderScript;
import android.support.v8.renderscript.ScriptIntrinsicBlur;

完全模糊

上面是局部模糊,然后我們改變一下 TextView 的寬高鋪滿父布局,使其和 ImageView 大小一樣來(lái)實(shí)現(xiàn)完全模糊效果:

...
<TextView
 android:id="@+id/text"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:gravity="center"
 android:text="Melody"
 android:textColor="@android:color/white"
 android:textSize="45sp"/>
...

java代碼部分不需要改變,下面再看效果圖:

效率如何?

為了查看操作耗時(shí),我使用 Log 在 blur() 方法的開頭和結(jié)束地方分別計(jì)算了時(shí)間,然后查看時(shí)間差:

10-09 17:04:23.664 23665-23665/com.melodyxxx.blurdemo2 E/MainActivity: spend: 120ms

可以看到居然花了 120ms,顯然效率不夠高,有沒有優(yōu)化的方法?(測(cè)試機(jī)型為 魅族 PRO 6)

效率優(yōu)化

上面的是直接將原 ImageView 的 bitmap 直接模糊處理,效率不夠高,所以我們可以先將原圖片進(jìn)行壓縮處理,然后在進(jìn)行模糊,下面為關(guān)鍵代碼,scaleFactor 為壓縮比例大小,例如 scaleFactor 為 2,代表先將原圖壓縮為原來(lái)的 1/2,然后進(jìn)行模糊,效率會(huì)高很多。

...
Bitmap outputBitmap = Bitmap.createBitmap((int) (mTargetView.getMeasuredWidth() / scaleFactor),
  (int) (mTargetView.getMeasuredHeight() / scaleFactor), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(outputBitmap);
canvas.translate(-mTargetView.getLeft() / scaleFactor, -mTargetView.getTop() / scaleFactor);
canvas.scale(1 / scaleFactor, 1 / scaleFactor);
Paint paint = new Paint();
paint.setFlags(Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(mInputBitmap, 0, 0, paint);
...

下面是 Demo 效果圖:

結(jié)果:

壓縮比例為 2 時(shí):耗時(shí) 19 ms

壓縮比例為 8 時(shí):耗時(shí) 2 ms

根據(jù)壓縮比例配合不同的模糊半徑可以達(dá)到不同模糊效果。

再來(lái)看 Demo 效果圖中拖動(dòng) SeekBar 可以動(dòng)態(tài)的實(shí)現(xiàn)模糊效果,首先想到的方法是每次拖動(dòng)時(shí)實(shí)時(shí)計(jì)算模糊,這樣的效率肯定不行,還會(huì)造成卡頓,我這里的方法是先將圖片最大化模糊一次設(shè)給上方 ImageView 的背景即可,然后 SeekBar 拖動(dòng)時(shí),只需要改變最上方或者下方圖片的透明度就可以達(dá)到上面的效果。

Demo apk 下載:http://fir.im/snmb

Demo 地址:點(diǎn)擊這里

總結(jié)

除了 RenderScript 以外還有一些其他的方法也可以實(shí)現(xiàn)高斯模糊,例如 FastBlur 等,在模糊的時(shí)候不要將原圖直接模糊處理,可采取先縮放然后再模糊,這樣可以大大提高模糊的速度。好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)各位開發(fā)者能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • android中貝塞爾曲線的應(yīng)用示例

    android中貝塞爾曲線的應(yīng)用示例

    本篇文章主要介紹了android中貝塞爾曲線的應(yīng)用示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-03-03
  • Android SD卡上文件操作及記錄日志操作實(shí)例分析

    Android SD卡上文件操作及記錄日志操作實(shí)例分析

    這篇文章主要介紹了Android SD卡上文件操作及記錄日志操作的方法,涉及Android針對(duì)SD卡與文件操作的相關(guān)技巧,需要的朋友可以參考下
    2016-01-01
  • Android 的回調(diào)事件詳解

    Android 的回調(diào)事件詳解

    這篇文章主要介紹了Android 的回調(diào)事件的相關(guān)資料,相當(dāng)?shù)脑敿?xì),有需要的小伙伴可以參考下
    2016-08-08
  • Kotlin入門學(xué)習(xí)教程之可見性修飾符

    Kotlin入門學(xué)習(xí)教程之可見性修飾符

    在Kotlin中,不管是類、接口、構(gòu)造函數(shù)、函數(shù)、屬性及其設(shè)置器都具有可見性修飾符,下面這篇文章主要給大家介紹了關(guān)于Kotlin入門學(xué)習(xí)教程之可見性修飾符的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Android實(shí)現(xiàn)QQ側(cè)滑菜單效果

    Android實(shí)現(xiàn)QQ側(cè)滑菜單效果

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)QQ側(cè)滑菜單效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • Android簡(jiǎn)單實(shí)現(xiàn)圓盤抽獎(jiǎng)界面

    Android簡(jiǎn)單實(shí)現(xiàn)圓盤抽獎(jiǎng)界面

    這篇文章主要介紹了Android簡(jiǎn)單實(shí)現(xiàn)圓盤抽獎(jiǎng)界面的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程詳解

    Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程詳解

    這篇文章主要介紹了Android隱私協(xié)議提示彈窗的實(shí)現(xiàn)流程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2023-01-01
  • Android中HttpURLConnection類使用介紹

    Android中HttpURLConnection類使用介紹

    早些時(shí)候其實(shí)我們都習(xí)慣性使用HttpClient,但是后來(lái)Android6.0之后不再支持HttpClient,需要添加Apache的jar才行,所以,就有很多開發(fā)者放棄使用HttpClient了,HttpURLConnection畢竟是標(biāo)準(zhǔn)Java接口(java.net) ,適配性還是很強(qiáng)的
    2022-12-12
  • 如何正確實(shí)現(xiàn)Android啟動(dòng)屏畫面的方法(避免白屏)

    如何正確實(shí)現(xiàn)Android啟動(dòng)屏畫面的方法(避免白屏)

    本篇文章主要介紹了如何正確實(shí)現(xiàn)Android啟動(dòng)屏畫面的方法(避免白屏),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-02-02
  • Android五大布局與實(shí)際應(yīng)用詳解

    Android五大布局與實(shí)際應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了Android五大布局與實(shí)際應(yīng)用,感興趣的小伙伴們可以參考一下
    2016-02-02

最新評(píng)論