神刀安全网

高斯模糊+带边框的圆形图+下拉PullScrollView

高斯模糊+带边框的圆形图+下拉PullScrollView
默认.png

高斯模糊+带边框的圆形图+下拉PullScrollView
下拉之后.png

  • 高斯模糊工具类
public class BitmapBlurUtil {     private static ExecutorService executor;      private static int POOL_SIZE = 2;// 单个CPU线程池大小      private static ExecutorService getExecutor() {          if (executor == null) {              int cpuNums = Runtime.getRuntime().availableProcessors();              executor = Executors.newFixedThreadPool(cpuNums * POOL_SIZE);          }          return executor;      }      public static void addTask(Bitmap bitmap, Handler handler) {          getExecutor().submit(new BitmapVagueTask(bitmap, handler));      }      /**      * 水平方向模糊度      */      private static float hRadius = 3;      /**      * 竖直方向模糊度      */      private static float vRadius = 3;      /**      * 模糊迭代度      */      private static int iterations = 5;      /**      * 异步      *      * @author baiyuliang      */      private static class BitmapVagueTask implements Runnable {          private Bitmap bitmap;          private Handler handler;          public BitmapVagueTask(Bitmap bitmap, Handler handler) {              super();              this.bitmap = bitmap;              this.handler = handler;          }          @Override          public void run() {              boxBlurFilter(bitmap, handler);          }      }      /**      * 高斯模糊      *      * @param bmp      * @return      */      private static void boxBlurFilter(Bitmap bmp, Handler handler) {          int width = bmp.getWidth();          int height = bmp.getHeight();          int[] inPixels = new int[width * height];          int[] outPixels = new int[width * height];          Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);          bmp.getPixels(inPixels, 0, width, 0, 0, width, height);          for (int i = 0; i < iterations; i++) {              blur(inPixels, outPixels, width, height, hRadius);              blur(outPixels, inPixels, height, width, vRadius);          }          blurFractional(inPixels, outPixels, width, height, hRadius);          blurFractional(outPixels, inPixels, height, width, vRadius);          bitmap.setPixels(inPixels, 0, width, 0, 0, width, height);          if (handler != null) {              @SuppressWarnings("deprecation")              Drawable drawable = new BitmapDrawable(bitmap);              Message message = new Message();              message.obj = drawable;              handler.sendMessage(message);          }      }      private static void blur(int[] in, int[] out, int width, int height, float radius) {          int widthMinus1 = width - 1;          int r = (int) radius;          int tableSize = 2 * r + 1;          int divide[] = new int[256 * tableSize];          for (int i = 0; i < 256 * tableSize; i++)              divide[i] = i / tableSize;          int inIndex = 0;          for (int y = 0; y < height; y++) {              int outIndex = y;              int ta = 0, tr = 0, tg = 0, tb = 0;              for (int i = -r; i <= r; i++) {                  int rgb = in[inIndex + clamp(i, 0, width - 1)];                  ta += (rgb >> 24) & 0xff;                  tr += (rgb >> 16) & 0xff;                  tg += (rgb >> 8) & 0xff;                  tb += rgb & 0xff;              }              for (int x = 0; x < width; x++) {                  out[outIndex] = (divide[ta] << 24) | (divide[tr] << 16)                          | (divide[tg] << 8) | divide[tb];                  int i1 = x + r + 1;                  if (i1 > widthMinus1)                      i1 = widthMinus1;                  int i2 = x - r;                  if (i2 < 0)                      i2 = 0;                  int rgb1 = in[inIndex + i1];                  int rgb2 = in[inIndex + i2];                  ta += ((rgb1 >> 24) & 0xff) - ((rgb2 >> 24) & 0xff);                  tr += ((rgb1 & 0xff0000) - (rgb2 & 0xff0000)) >> 16;                  tg += ((rgb1 & 0xff00) - (rgb2 & 0xff00)) >> 8;                  tb += (rgb1 & 0xff) - (rgb2 & 0xff);                  outIndex += height;              }              inIndex += width;          }      }      private static void blurFractional(int[] in, int[] out, int width,                                         int height, float radius) {          radius -= (int) radius;          float f = 1.0f / (1 + 2 * radius);          int inIndex = 0;          for (int y = 0; y < height; y++) {              int outIndex = y;              out[outIndex] = in[0];              outIndex += height;              for (int x = 1; x < width - 1; x++) {                  int i = inIndex + x;                  int rgb1 = in[i - 1];                  int rgb2 = in[i];                  int rgb3 = in[i + 1];                  int a1 = (rgb1 >> 24) & 0xff;                  int r1 = (rgb1 >> 16) & 0xff;                  int g1 = (rgb1 >> 8) & 0xff;                  int b1 = rgb1 & 0xff;                  int a2 = (rgb2 >> 24) & 0xff;                  int r2 = (rgb2 >> 16) & 0xff;                  int g2 = (rgb2 >> 8) & 0xff;                  int b2 = rgb2 & 0xff;                  int a3 = (rgb3 >> 24) & 0xff;                  int r3 = (rgb3 >> 16) & 0xff;                  int g3 = (rgb3 >> 8) & 0xff;                  int b3 = rgb3 & 0xff;                  a1 = a2 + (int) ((a1 + a3) * radius);                  r1 = r2 + (int) ((r1 + r3) * radius);                  g1 = g2 + (int) ((g1 + g3) * radius);                  b1 = b2 + (int) ((b1 + b3) * radius);                  a1 *= f;                  r1 *= f;                  g1 *= f;                  b1 *= f;                  out[outIndex] = (a1 << 24) | (r1 << 16) | (g1 << 8) | b1;                  outIndex += height;              }              out[outIndex] = in[width - 1];              inIndex += width;          }      }      public static int clamp(int x, int a, int b) {          return (x < a) ? a : (x > b) ? b : x;      } }
  • 带边框的圆形图 首先在attrs 文件 定义两个属性
    <declare-styleable name="circle">  <attr name="civ_border_color" format="color" />  <attr name="civ_border_width" format="dimension" />  </declare-styleable>
  • 圆形图代码
public class CircularImageView extends ImageView {         private int borderWidth = 4;         private int viewWidth;         private int viewHeight;          private Bitmap image;          private Paint paint;          private Paint paintBorder;          private BitmapShader shader;          public CircularImageView(Context context)          {              super(context);              setup();          }          public CircularImageView(Context context, AttributeSet attrs)          {              super(context, attrs);              setup();          }          public CircularImageView(Context context, AttributeSet attrs, int defStyle)          {              super(context, attrs, defStyle);              setup();          }          private void setup()   {              paint = new Paint();// init paint              paint.setAntiAlias(true);              paintBorder = new Paint();              setBorderColor(Color.WHITE);              paintBorder.setAntiAlias(true);              this.setLayerType(LAYER_TYPE_SOFTWARE, paintBorder);              paintBorder.setShadowLayer(4.0f, 0.0f, 2.0f, Color.BLACK);          }          public void setBorderWidth(int borderWidth)          {              this.borderWidth = borderWidth;              this.invalidate();          }          public void setBorderColor(int borderColor)          {              if (paintBorder != null)                  paintBorder.setColor(borderColor);              this.invalidate();          }          private void loadBitmap()          {              BitmapDrawable bitmapDrawable = (BitmapDrawable) this.getDrawable();              if (bitmapDrawable != null)                  image = bitmapDrawable.getBitmap();          }          @SuppressLint("DrawAllocation")          @Override          public void onDraw(Canvas canvas)  {              loadBitmap();// load the bitmap            if (image != null)// init shader              {                 shader = new BitmapShader(Bitmap.createScaledBitmap(image, canvas.getWidth(), canvas.getHeight(), false), Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);                  paint.setShader(shader);                  int circleCenter = viewWidth / 2;                 canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter + borderWidth - 4.0f, paintBorder);                  canvas.drawCircle(circleCenter + borderWidth, circleCenter + borderWidth, circleCenter - 4.0f, paint);              }          }          @Override          protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)          {              int width = measureWidth(widthMeasureSpec);              int height = measureHeight(heightMeasureSpec, widthMeasureSpec);              viewWidth = width - (borderWidth * 2);              viewHeight = height - (borderWidth * 2);              setMeasuredDimension(width, height);          }          private int measureWidth(int measureSpec)          {              int result = 0;              int specMode = MeasureSpec.getMode(measureSpec);              int specSize = MeasureSpec.getSize(measureSpec);              if (specMode == MeasureSpec.EXACTLY)              {                  result = specSize;              }              else              {                  result = viewWidth;              }              return result;          }          private int measureHeight(int measureSpecHeight, int measureSpecWidth)          {              int result = 0;              int specMode = MeasureSpec.getMode(measureSpecHeight);              int specSize = MeasureSpec.getSize(measureSpecHeight);              if (specMode == MeasureSpec.EXACTLY)   {            result = specSize;              } else{                  result = viewHeight;              }              return (result + 2);          }          /**       * 把bitmap转成圆形       */      public Bitmap toRoundBitmap(Bitmap bitmap) {          int width = bitmap.getWidth();          int height = bitmap.getHeight();          int r = 0;         if (width < height) {              r = width;          } else {              r = height;          }          Bitmap backgroundBm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);//构建一个bitmap          Canvas canvas = new Canvas(backgroundBm);//new一个Canvas,在backgroundBmp上画图          Paint p = new Paint();//设置边缘光滑,去掉锯齿         p.setAntiAlias(true);          RectF rect = new RectF(0, 0, r, r);        canvas.drawRoundRect(rect, r / 2, r / 2, p);//通过制定的rect画一个圆角矩形,当圆角X轴方向的半径等于Y轴方向的半径时,且都等于r/2时,画出来的圆角矩形就是圆          p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//设置当两个图形相交时的模式,SRC_IN为取SRC图形相交的部分,多余的将被去掉         canvas.drawBitmap(bitmap, null, rect, p);//canvas将bitmap画在backgroundBmp上         return backgroundBm;    }}
  • PullScrollView
public class PullScrollView extends ScrollView implements          ViewTreeObserver.OnGlobalLayoutListener {      View view;     int srcTopMargion;     float lastY;     float offsetY;      public PullScrollView(Context context, AttributeSet attrs) {         super(context, attrs);         ViewTreeObserver observer = getViewTreeObserver();         if (null != observer)             observer.addOnGlobalLayoutListener(this);     }       @Override     protected void onFinishInflate() {         super.onFinishInflate();         view = findViewById(R.id.pull_img);     }       @Override     public boolean onTouchEvent(MotionEvent ev) {         int action = ev.getAction();         float y = ev.getY();         Log.d("onTouchEvent", "action=" + action + ",y=" + y);         MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();         switch (action) {             case MotionEvent.ACTION_DOWN:                 lastY = y;                 break;             case MotionEvent.ACTION_MOVE:                 //计算滑动y方向偏移值                 offsetY = y - lastY;                 //向下移动                 if (offsetY > 0) {                     //滑动到看到所有图片展示,交给原来的逻辑处理                     if (params.topMargin == 0) {                         return super.onTouchEvent(ev);                     }                     //在不是下拉图片的时候,向下移动,交给原来的逻辑处理                     if (getScrollY() != 0) {                         return super.onTouchEvent(ev);                     }                     //可以下拉图片的情况                     params.topMargin += offsetY / 10;                     Log.d("onTouchEvent", "topMargin" + params.topMargin + ",lastY=" + lastY + ",y=" + y + ",offsetY" + offsetY);                     if (params.topMargin >= 0) {                         params.topMargin = 0;                     }                     view.setLayoutParams(params);                     invalidate();                 }                 lastY = y;                 break;             case MotionEvent.ACTION_UP:                 //不和原始margion偏移一样的时候                 if (params.topMargin != -srcTopMargion) {                     Log.d("ACTION_UP", "moveY=" + (srcTopMargion + params.topMargin));                     //滚动原始偏移值和现在偏移值之间的差值 eg:3~10                     ObjectAnimator animator = ObjectAnimator.ofInt(this, "moveY", params.topMargin, -srcTopMargion);                     animator.setDuration(200);                     animator.setInterpolator(new AccelerateDecelerateInterpolator());                     animator.start();                 }                 break;         }         return super.onTouchEvent(ev);     }      /**      * 设置移动中的Y值      *      * @param value      */     public void setMoveY(int value) {         MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();         params.topMargin = value;         Log.d("computeScroll", "topMargin=" + params.topMargin);         view.setLayoutParams(params);         invalidate();     }      @Override     public void onGlobalLayout() {         MarginLayoutParams params = (MarginLayoutParams) view.getLayoutParams();         srcTopMargion = -params.topMargin;         Log.d("srcTopMargion", "" + srcTopMargion);         getViewTreeObserver()                 .removeGlobalOnLayoutListener(this);     }}
  • 布局文件
    高斯模糊+带边框的圆形图+下拉PullScrollView
    E1AA3EA2-0FE3-4189-9C8A-0F1579D18087.png

  • activity
public class PersonalActivity extends Activity implements View.OnClickListener {     ImageView pull_img;      @Override     protected void onCreate(Bundle savedInstanceState) {         super.onCreate(savedInstanceState);         setContentView(R.layout.layout);         pull_img = (ImageView) findViewById(R.id.pull_img);         Resources res = getResources();         Bitmap bmp = BitmapFactory.decodeResource(res, R.mipmap.pull_img);          BitmapBlurUtil.addTask(bmp, new Handler() {             @Override             public void handleMessage(Message msg) {                 super.handleMessage(msg);                 Drawable drawable = (Drawable) msg.obj;                 pull_img.setImageDrawable(drawable);              }         });     }      @Override     public void onClick(View view) {      } }

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » 高斯模糊+带边框的圆形图+下拉PullScrollView

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址