Search in sources :

Example 26 with Shader

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();
}
Also used : FilterMirrorRepresentation(com.android.gallery3d.filtershow.filters.FilterMirrorRepresentation) Rect(android.graphics.Rect) ImagePreset(com.android.gallery3d.filtershow.pipeline.ImagePreset) ArrayList(java.util.ArrayList) FilterRepresentation(com.android.gallery3d.filtershow.filters.FilterRepresentation) Point(android.graphics.Point) Shader(android.graphics.Shader) BitmapShader(android.graphics.BitmapShader) RectF(android.graphics.RectF) Bitmap(android.graphics.Bitmap) Matrix(android.graphics.Matrix)

Example 27 with Shader

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);
    }
}
Also used : Path(android.graphics.Path) LinearGradient(android.graphics.LinearGradient) Shader(android.graphics.Shader) Paint(android.graphics.Paint)

Example 28 with Shader

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;
}
Also used : LinearGradient(android.graphics.LinearGradient) RectShape(android.graphics.drawable.shapes.RectShape) ShapeDrawable(android.graphics.drawable.ShapeDrawable) PaintDrawable(android.graphics.drawable.PaintDrawable) Shader(android.graphics.Shader)

Example 29 with Shader

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);
}
Also used : Path(android.graphics.Path) LinearGradient(android.graphics.LinearGradient) Shader(android.graphics.Shader)

Example 30 with Shader

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);
}
Also used : LinearGradient(android.graphics.LinearGradient) Shader(android.graphics.Shader)

Aggregations

Shader (android.graphics.Shader)77 Paint (android.graphics.Paint)41 LinearGradient (android.graphics.LinearGradient)38 BitmapShader (android.graphics.BitmapShader)21 Bitmap (android.graphics.Bitmap)17 ShapeDrawable (android.graphics.drawable.ShapeDrawable)15 Matrix (android.graphics.Matrix)13 RectShape (android.graphics.drawable.shapes.RectShape)9 PaintDrawable (android.graphics.drawable.PaintDrawable)8 Point (android.graphics.Point)7 SuppressLint (android.annotation.SuppressLint)6 ColorDrawable (android.graphics.drawable.ColorDrawable)6 Drawable (android.graphics.drawable.Drawable)5 OvalShape (android.graphics.drawable.shapes.OvalShape)5 CallSuper (android.annotation.CallSuper)4 Rect (android.graphics.Rect)4 RectF (android.graphics.RectF)4 ShaderFactory (android.graphics.drawable.ShapeDrawable.ShaderFactory)4 Test (org.junit.Test)4 Canvas (android.graphics.Canvas)3