Skip to content

Instantly share code, notes, and snippets.

@owaistnt
Forked from julianshen/CircleTransform.java
Last active January 27, 2016 05:53
Show Gist options
  • Save owaistnt/8db701dfc36d554a9df9 to your computer and use it in GitHub Desktop.
Save owaistnt/8db701dfc36d554a9df9 to your computer and use it in GitHub Desktop.
CircleTransform for Picasso
/*
* Copyright 2014 Owais Idris
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.example.picassodemo;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Paint;
import com.squareup.picasso.Transformation;
/**
* Created by owais on 30/12/15.
*/
public class CircleCropTransformation implements Transformation {
int targetWidth;
public CircleCropTransformation(int targetWidth) {
this.targetWidth = targetWidth;
}
@Override
public Bitmap transform(Bitmap source) {
int targetWidth = this.targetWidth;
double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
int targetHeight = (int) (targetWidth * aspectRatio);
Bitmap sourceB = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
if (sourceB != source) {
// Same bitmap is returned if sizes are the same
source.recycle();
}
int size = Math.min(sourceB.getWidth(), sourceB.getHeight());
int x = (sourceB.getWidth() - size)/ 2;
int y = (sourceB.getHeight() - size)/2;
Bitmap squaredBitmap = Bitmap.createBitmap(sourceB, x, y, size, size);
if (squaredBitmap != sourceB) {
sourceB.recycle();
}
Bitmap bitmap = Bitmap.createBitmap(size, size, sourceB.getConfig());
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap, BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
/*canvas.drawRoundRect(new RectF(0,0, 800, 800), r/2, r/2,paint);*/
sourceB.recycle();
return bitmap;
}
@Override
public String key() {
return "CircleCropTransformation";
}
}
@owaistnt
Copy link
Author

This is Circle-transform but added Re-sizing with maintaining aspect ratio. This makes your RecyclerView faster and non lagging.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment