use of android.graphics.Shader in project android_packages_apps_Gallery2 by LineageOS.
the class ImageShow method drawImageAndAnimate.
public void drawImageAndAnimate(Canvas canvas, Bitmap image) {
if (image == null) {
return;
}
MasterImage master = MasterImage.getImage();
Matrix m = master.computeImageToScreen(image, 0, false);
if (m == null) {
return;
}
canvas.save();
RectF d = new RectF(0, 0, image.getWidth(), image.getHeight());
m.mapRect(d);
d.roundOut(mImageBounds);
master.setImageBounds(canvas, mImageBounds);
boolean showAnimatedImage = master.onGoingNewLookAnimation();
if (!showAnimatedImage && mDidStartAnimation) {
// animation ended, but do we have the correct image to show?
if (master.getPreset().equals(master.getCurrentPreset())) {
// we do, let's stop showing the animated image
mDidStartAnimation = false;
MasterImage.getImage().resetAnimBitmap();
} else {
showAnimatedImage = true;
}
} else if (showAnimatedImage) {
mDidStartAnimation = true;
}
if (showAnimatedImage) {
canvas.save();
// Animation uses the image before the change
Bitmap previousImage = master.getPreviousImage();
Matrix mp = master.computeImageToScreen(previousImage, 0, false);
RectF dp = new RectF(0, 0, previousImage.getWidth(), previousImage.getHeight());
mp.mapRect(dp);
Rect previousBounds = new Rect();
dp.roundOut(previousBounds);
float centerX = dp.centerX();
float centerY = dp.centerY();
boolean needsToDrawImage = true;
if (master.getCurrentLookAnimation() == MasterImage.CIRCLE_ANIMATION) {
float maskScale = MasterImage.getImage().getMaskScale();
if (maskScale >= 0.0f) {
float maskW = sMask.getWidth() / 2.0f;
float maskH = sMask.getHeight() / 2.0f;
Point point = mActivity.hintTouchPoint(this);
float maxMaskScale = 2 * Math.max(getWidth(), getHeight()) / Math.min(maskW, maskH);
maskScale = maskScale * maxMaskScale;
float x = point.x - maskW * maskScale;
float y = point.y - maskH * maskScale;
// Prepare the shader
mShaderMatrix.reset();
mShaderMatrix.setScale(1.0f / maskScale, 1.0f / maskScale);
mShaderMatrix.preTranslate(-x + mImageBounds.left, -y + mImageBounds.top);
float scaleImageX = mImageBounds.width() / (float) image.getWidth();
float scaleImageY = mImageBounds.height() / (float) image.getHeight();
mShaderMatrix.preScale(scaleImageX, scaleImageY);
mMaskPaint.reset();
Shader maskShader = createShader(image);
maskShader.setLocalMatrix(mShaderMatrix);
mMaskPaint.setShader(maskShader);
// as needed
drawShadow(canvas, mImageBounds);
canvas.drawBitmap(previousImage, m, mPaint);
canvas.clipRect(mImageBounds);
canvas.translate(x, y);
canvas.scale(maskScale, maskScale);
canvas.drawBitmap(sMask, 0, 0, mMaskPaint);
needsToDrawImage = false;
}
} else if (master.getCurrentLookAnimation() == MasterImage.ROTATE_ANIMATION) {
Rect d1 = computeImageBounds(master.getPreviousImage().getHeight(), master.getPreviousImage().getWidth());
Rect d2 = computeImageBounds(master.getPreviousImage().getWidth(), master.getPreviousImage().getHeight());
float finalScale = d1.width() / (float) d2.height();
finalScale = (1.0f * (1.0f - master.getAnimFraction())) + (finalScale * master.getAnimFraction());
canvas.rotate(master.getAnimRotationValue(), centerX, centerY);
canvas.scale(finalScale, finalScale, centerX, centerY);
} else if (master.getCurrentLookAnimation() == MasterImage.MIRROR_ANIMATION) {
if (master.getCurrentFilterRepresentation() instanceof FilterMirrorRepresentation) {
FilterMirrorRepresentation rep = (FilterMirrorRepresentation) master.getCurrentFilterRepresentation();
ImagePreset preset = master.getPreset();
ArrayList<FilterRepresentation> geometry = (ArrayList<FilterRepresentation>) preset.getGeometryFilters();
GeometryMathUtils.GeometryHolder holder = null;
holder = GeometryMathUtils.unpackGeometry(geometry);
if (holder.rotation.value() == 90 || holder.rotation.value() == 270) {
if (rep.isHorizontal() && !rep.isVertical()) {
canvas.scale(1, master.getAnimRotationValue(), centerX, centerY);
} else if (rep.isVertical() && !rep.isHorizontal()) {
canvas.scale(1, master.getAnimRotationValue(), centerX, centerY);
} else if (rep.isHorizontal() && rep.isVertical()) {
canvas.scale(master.getAnimRotationValue(), 1, centerX, centerY);
} else {
canvas.scale(master.getAnimRotationValue(), 1, centerX, centerY);
}
} else {
if (rep.isHorizontal() && !rep.isVertical()) {
canvas.scale(master.getAnimRotationValue(), 1, centerX, centerY);
} else if (rep.isVertical() && !rep.isHorizontal()) {
canvas.scale(master.getAnimRotationValue(), 1, centerX, centerY);
} else if (rep.isHorizontal() && rep.isVertical()) {
canvas.scale(1, master.getAnimRotationValue(), centerX, centerY);
} else {
canvas.scale(1, master.getAnimRotationValue(), centerX, centerY);
}
}
}
}
if (needsToDrawImage) {
// as needed
drawShadow(canvas, previousBounds);
if (hasFusionApplied() || this instanceof ImageFusion) {
previousImage.setHasAlpha(true);
}
canvas.drawBitmap(previousImage, mp, mPaint);
}
canvas.restore();
} else {
// as needed
drawShadow(canvas, mImageBounds);
if (hasFusionApplied() || this instanceof ImageFusion) {
image.setHasAlpha(true);
}
canvas.drawBitmap(image, m, mPaint);
}
canvas.restore();
}
use of android.graphics.Shader in project anitrend-app by AniTrend.
the class RingProgress method drawProgress.
private void drawProgress(Canvas canvas, Paint paint) {
for (int i = 0; i < mListStatsRing.size(); i++) {
paint.reset();
paint.setAntiAlias(true);
paint.setStrokeWidth(ringWidth);
paint.setStyle(Paint.Style.STROKE);
Path pathProgress = new Path();
pathProgress.addArc(mListStatsRing.get(i).getRectFRing(), 0, (int) (SweepAngle / 100f * mListStatsRing.get(i).getProgress() * mAnimatedValue));
Shader mShader = new LinearGradient(mListStatsRing.get(i).getRectFRing().left, mListStatsRing.get(i).getRectFRing().top, mListStatsRing.get(i).getRectFRing().left, mListStatsRing.get(i).getRectFRing().bottom, new int[] { colorSetsStart[i], colorSetsEnd[i] }, new float[] { 0f, 1f }, Shader.TileMode.CLAMP);
paint.setShader(mShader);
if (isCorner) {
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeJoin(Paint.Join.ROUND);
}
canvas.drawPath(pathProgress, paint);
paint.setShader(null);
mPaintText.setTextSize(mPaint.getStrokeWidth() / 2);
String textvalue = String.valueOf(mListStatsRing.get(i).getValue());
float arc_length = (float) (Math.PI * mListStatsRing.get(i).getRectFRing().width() * (mListStatsRing.get(i).getProgress() / 100f)) * (SweepAngle / 360f);
float textvalue_length = getFontlength(mPaintText, textvalue);
if (mAnimatedValue == 1) {
if (arc_length - textvalue_length * 1.5f <= 0) {
float textvalue_length_one = textvalue_length * 1.0f / textvalue.length();
int textvalue_size = (int) (arc_length / textvalue_length_one);
if (textvalue_size >= textvalue.length()) {
canvas.drawTextOnPath(textvalue, pathProgress, 10, getFontHeight(mPaintText) / 3, mPaintText);
} else {
String text = textvalue.substring(0, 1);
for (int j = 0; j < textvalue_size; j++) {
text = text + ".";
}
canvas.drawTextOnPath(text, pathProgress, 10, getFontHeight(mPaintText) / 3, mPaintText);
}
} else {
canvas.drawTextOnPath(textvalue, pathProgress, (float) (arc_length - textvalue_length * 1.5f), getFontHeight(mPaintText) / 3, mPaintText);
}
}
String text = String.valueOf(mListStatsRing.get(i).getName());
float textlength = getFontlength(mPaintText, text);
float textlength_one = textlength * 1.0f / text.length();
float showtextlength = (float) (arc_length - textvalue_length * 1.8f);
if (showtextlength < 0)
showtextlength = 0;
float textsize = showtextlength / textlength_one;
if (textsize > text.length()) {
textsize = text.length();
} else if (textsize < 1) {
textsize = 0;
}
canvas.drawTextOnPath(text.substring(0, (int) textsize), pathProgress, 10, getFontHeight(mPaintText) / 3, mPaintText);
}
}
use of android.graphics.Shader in project plaid by nickbutcher.
the class ScrimUtil method makeCubicGradientScrimDrawable.
/**
* Creates an approximated cubic gradient using a multi-stop linear gradient. See
* <a href="https://plus.google.com/+RomanNurik/posts/2QvHVFWrHZf">this post</a> for more
* details.
*/
public static Drawable makeCubicGradientScrimDrawable(@ColorInt int baseColor, int numStops, int gravity) {
numStops = Math.max(numStops, 2);
PaintDrawable paintDrawable = new PaintDrawable();
paintDrawable.setShape(new RectShape());
final int[] stopColors = new int[numStops];
int alpha = Color.alpha(baseColor);
for (int i = 0; i < numStops; i++) {
float x = i * 1f / (numStops - 1);
float opacity = MathUtils.clamp((float) Math.pow(x, 3), 0, 1);
stopColors[i] = ColorUtils.modifyAlpha(baseColor, (int) (alpha * opacity));
}
final float x0, x1, y0, y1;
switch(gravity & Gravity.HORIZONTAL_GRAVITY_MASK) {
case Gravity.LEFT:
x0 = 1;
x1 = 0;
break;
case Gravity.RIGHT:
x0 = 0;
x1 = 1;
break;
default:
x0 = 0;
x1 = 0;
break;
}
switch(gravity & Gravity.VERTICAL_GRAVITY_MASK) {
case Gravity.TOP:
y0 = 1;
y1 = 0;
break;
case Gravity.BOTTOM:
y0 = 0;
y1 = 1;
break;
default:
y0 = 0;
y1 = 0;
break;
}
paintDrawable.setShaderFactory(new ShapeDrawable.ShaderFactory() {
@Override
public Shader resize(int width, int height) {
LinearGradient linearGradient = new LinearGradient(width * x0, height * y0, width * x1, height * y1, stopColors, null, Shader.TileMode.CLAMP);
return linearGradient;
}
});
return paintDrawable;
}
use of android.graphics.Shader in project LoadingView by ldoublem.
the class LVRingProgress method drawProgress.
private void drawProgress(Canvas canvas, Paint paint, int sweepAngle) {
paint.reset();
paint.setAntiAlias(true);
paint.setStrokeWidth(mPadding);
paint.setStyle(Paint.Style.STROKE);
Path pathProgress = new Path();
pathProgress.addArc(rectFBg, -90, sweepAngle);
Shader mShader = new LinearGradient(rectFBg.left, rectFBg.top, rectFBg.left, rectFBg.bottom, new int[] { ProStartColor, ProEndColor }, new float[] { 0f, 1f }, Shader.TileMode.CLAMP);
paint.setShader(mShader);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeJoin(Paint.Join.ROUND);
canvas.drawPath(pathProgress, paint);
paint.setShader(null);
mPaintText.setTextSize(mPaint.getStrokeWidth() / 2);
String text = String.valueOf((int) (sweepAngle / MaxAngle * 100)) + "%";
canvas.drawTextOnPath(text, pathProgress, (float) (Math.PI * rectFBg.width() * (sweepAngle / MaxAngle) - getFontlength(mPaintText, text) * 1.5f), getFontHeight(mPaintText) / 3, mPaintText);
}
use of android.graphics.Shader in project DiscreteScrollView by yarolegovich.
the class ForecastView method initGradient.
private void initGradient() {
float centerX = getWidth() * 0.5f;
Shader gradient = new LinearGradient(centerX, 0, centerX, getHeight(), currentGradient, null, Shader.TileMode.MIRROR);
gradientPaint.setShader(gradient);
}
Aggregations