真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

Android動態(tài)模糊效果的快速實現(xiàn)方法

寫在前面

專業(yè)領域包括成都做網(wǎng)站、成都網(wǎng)站建設、成都外貿(mào)網(wǎng)站建設商城網(wǎng)站定制開發(fā)、微信營銷、系統(tǒng)平臺開發(fā), 與其他網(wǎng)站設計及系統(tǒng)開發(fā)公司不同,創(chuàng)新互聯(lián)建站的整合解決方案結合了幫做網(wǎng)絡品牌建設經(jīng)驗和互聯(lián)網(wǎng)整合營銷的理念,并將策略和執(zhí)行緊密結合,為客戶提供全網(wǎng)互聯(lián)網(wǎng)整合方案。

現(xiàn)在,越來越多的App里面使用了模糊效果,這種模糊效果稱之為高斯模糊。大家都知道,在Android平臺上進行模糊渲染是一個相當耗CPU也相當耗時的操作,一旦處理不好,卡頓是在所難免的。一般來說,考慮到效率,渲染一張圖片最好的方法是使用OpenGL,其次是使用C++/C,使用Java代碼是效率是最低,速度也是最慢的。但是Android推出RenderScript之后,我們就有了選擇,測試表明,使用RederScript的渲染效率和使用C++/C不相上下,但是使用RenderScript卻比使用JNI簡單得多!同時,Android團隊提供了RenderScript的支持庫,使得在低版本的Android平臺上也能使用。
不過在使用RenderScript之前,對于模糊一張圖片,需要注意的是,我們應該盡量不要使用原尺寸分辨率的圖片,最好將圖片縮小比例,這小渲染的效率要高一些,速度也更快一些。

什么是RenderScript

RenderScript是一種低級的高性能編程語言,用于3D渲染和處理密集型計算(3D播放等和關于CPU密集型的計算)。一直以來Android 在繪圖性能的表現(xiàn)一直差強人意,引入NDK之后才有所改善,而在Honeycomb 中發(fā)布了RenderScript 這一殺手級在Framework 后,大大的增加了Android本地語言的執(zhí)行能力和計算能力。現(xiàn)在網(wǎng)上介紹RenderScript的文章非常少,附上一篇博客,大家可以能更好理解這門語言。

關于Android RenderScript 的詳細說明和一些實用文檔

如果需要詳細了解,可以查看官方文檔RenderScript

動態(tài)模糊的實現(xiàn)
使用之前,先要在Module build.gradle里面作下面的定義:

Android動態(tài)模糊效果的快速實現(xiàn)方法

MainActivity.java

package com.jackie.blurimage; 
 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.widget.ImageView; 
import android.widget.SeekBar; 
import android.widget.TextView; 
 
public class MainActivity extends AppCompatActivity { 
  private ImageView mBlurImage, mOriginImage; 
  private SeekBar mSeekBar; 
  private TextView mSeekProgress; 
 
  private int mAlpha; 
 
  @Override 
  protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
 
    initView(); 
    initData(); 
    initEvent(); 
  } 
 
  private void initView() { 
    mBlurImage = (ImageView) findViewById(R.id.blur_image); 
    mOriginImage = (ImageView) findViewById(R.id.origin_image); 
    mSeekBar = (SeekBar) findViewById(R.id.seek_bar); 
    mSeekProgress = (TextView) findViewById(R.id.seek_progress); 
  } 
 
  private void initData() { 
    // 獲取圖片 
    Bitmap originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blur); 
    Bitmap blurBitmap = BlurUtils.blur(this, originBitmap); 
 
    // 填充模糊后的圖像和原圖 
    mBlurImage.setImageBitmap(blurBitmap); 
    mOriginImage.setImageBitmap(originBitmap); 
  } 
 
  private void initEvent() { 
    mSeekBar.setMax(100); 
 
    mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
        mAlpha = progress; 
 
        mOriginImage.setAlpha((int) (255 - mAlpha * 2.55)); 
        mSeekProgress.setText(String.valueOf(mAlpha)); 
      } 
 
      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 
 
      } 
 
      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 
 
      } 
    }); 
  } 
} 

activity_main.xml

 
 
 
   
 
     
 
     
   
 
   
 
     
 
     
   
 

從上面的代碼可以看出,在FrameLayout上放了兩張圖片,然后動態(tài)更改圖片的透明度來達到動態(tài)模糊效果。
BlurUtils.java

package com.jackie.blurimage; 
 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.renderscript.Allocation; 
import android.renderscript.Element; 
import android.renderscript.RenderScript; 
import android.renderscript.ScriptIntrinsicBlur; 
 
/** 
 * Created by Jackie on 2017/1/21. 
 * 高斯模糊工具類 
 */ 
 
public class BlurUtils { 
  /** 
   * 圖片縮放比例 
   */ 
  private static final float SCALE_DEGREE = 0.4f; 
  /** 
   * 最大模糊度(在0.0到25.0之間) 
   */ 
  private static final float BLUR_RADIUS = 25f; 
 
  /** 
   * 模糊圖片 
   * @param context  上下文 
   * @param bitmap  需要模糊的圖片 
   * @return     模糊處理后的圖片 
   */ 
  public static Bitmap blur(Context context,Bitmap bitmap) { 
    //計算圖片縮小的長寬 
    int width = Math.round(bitmap.getWidth() * SCALE_DEGREE); 
    int height = Math.round(bitmap.getHeight() * SCALE_DEGREE); 
 
    //將縮小后的圖片作為預渲染的圖片 
    Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false); 
    //創(chuàng)建一張渲染后的輸入圖片 
    Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 
 
    //創(chuàng)建RenderScript內(nèi)核對象 
    RenderScript renderScript = RenderScript.create(context); 
    //創(chuàng)建一個模糊效果的RenderScript的工具對象 
    ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); 
 
    /** 
     * 由于RenderScript并沒有使用VM來分配內(nèi)存,所以需要使用Allocation類來創(chuàng)建和分配內(nèi)存空間。 
     * 創(chuàng)建Allocation對象的時候其實內(nèi)存是空的,需要使用copyTo()將數(shù)據(jù)填充進去。 
     */ 
    Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap); 
    Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap); 
 
    //設置渲染的模糊程度,25f是最大模糊度 
    scriptIntrinsicBlur.setRadius(BLUR_RADIUS); 
    //設置ScriptIntrinsicBlur對象的輸入內(nèi)存 
    scriptIntrinsicBlur.setInput(inputAllocation); 
    //將ScriptIntrinsicBlur輸出數(shù)據(jù)保存到輸出內(nèi)存中 
    scriptIntrinsicBlur.forEach(outputAllocation); 
 
    //將數(shù)據(jù)填充到Allocation中 
    outputAllocation.copyTo(outputBitmap); 
 
    return outputBitmap; 
  } 
} 

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


分享標題:Android動態(tài)模糊效果的快速實現(xiàn)方法
文章來源:http://weahome.cn/article/ipdggs.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部