寫在前面
現(xiàn)在,越來越多的App里面使用了模糊效果,這種模糊效果稱之為高斯模糊。大家都知道,在Android平臺上進(jìn)行模糊渲染是一個相當(dāng)耗CPU也相當(dāng)耗時的操作,一旦處理不好,卡頓是在所難免的。一般來說,考慮到效率,渲染一張圖片最好的方法是使用OpenGL,其次是使用C++/C,使用Java代碼是效率是最低,速度也是最慢的。但是Android推出RenderScript之后,我們就有了選擇,測試表明,使用RederScript的渲染效率和使用C++/C不相上下,但是使用RenderScript卻比使用JNI簡單得多!同時,Android團(tuán)隊提供了RenderScript的支持庫,使得在低版本的Android平臺上也能使用。
不過在使用RenderScript之前,對于模糊一張圖片,需要注意的是,我們應(yīng)該盡量不要使用原尺寸分辨率的圖片,最好將圖片縮小比例,這小渲染的效率要高一些,速度也更快一些。
什么是RenderScript
RenderScript是一種低級的高性能編程語言,用于3D渲染和處理密集型計算(3D播放等和關(guān)于CPU密集型的計算)。一直以來Android 在繪圖性能的表現(xiàn)一直差強(qiáng)人意,引入NDK之后才有所改善,而在Honeycomb 中發(fā)布了RenderScript 這一殺手級在Framework 后,大大的增加了Android本地語言的執(zhí)行能力和計算能力?,F(xiàn)在網(wǎng)上介紹RenderScript的文章非常少,附上一篇博客,大家可以能更好理解這門語言。
關(guān)于Android RenderScript 的詳細(xì)說明和一些實用文檔
如果需要詳細(xì)了解,可以查看官方文檔RenderScript
動態(tài)模糊的實現(xiàn)
使用之前,先要在Module build.gradle里面作下面的定義:
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) { } }); } }