You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
5.7 KiB
155 lines
5.7 KiB
package org.purplei2p.lightning.utils; |
|
|
|
import android.app.Application; |
|
import android.graphics.Bitmap; |
|
import android.graphics.Canvas; |
|
import android.graphics.Color; |
|
import android.graphics.Paint; |
|
import android.graphics.PorterDuff; |
|
import android.graphics.PorterDuffXfermode; |
|
import android.graphics.RectF; |
|
import android.graphics.Typeface; |
|
import android.graphics.drawable.Drawable; |
|
import android.os.Build; |
|
import android.support.annotation.ColorInt; |
|
import android.support.annotation.NonNull; |
|
import android.support.annotation.Nullable; |
|
import android.support.v4.content.ContextCompat; |
|
import android.view.View; |
|
|
|
import org.purplei2p.lightning.R; |
|
|
|
public class DrawableUtils { |
|
|
|
@NonNull |
|
public static Bitmap getRoundedNumberImage(int number, int width, int height, int color, int thickness) { |
|
String text; |
|
|
|
if (number > 99) { |
|
text = "\u221E"; |
|
} else { |
|
text = String.valueOf(number); |
|
} |
|
|
|
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |
|
Canvas canvas = new Canvas(image); |
|
Paint paint = new Paint(); |
|
paint.setColor(color); |
|
Typeface boldText = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD); |
|
paint.setTypeface(boldText); |
|
paint.setTextSize(Utils.dpToPx(14)); |
|
paint.setAntiAlias(true); |
|
paint.setTextAlign(Paint.Align.CENTER); |
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); |
|
|
|
int radius = Utils.dpToPx(2); |
|
|
|
RectF outer = new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); |
|
canvas.drawRoundRect(outer, radius, radius, paint); |
|
|
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); |
|
|
|
radius--; |
|
RectF inner = new RectF(thickness, thickness, canvas.getWidth() - thickness, canvas.getHeight() - thickness); |
|
canvas.drawRoundRect(inner, radius, radius, paint); |
|
|
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); |
|
|
|
int xPos = (canvas.getWidth() / 2); |
|
int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)); |
|
|
|
canvas.drawText(String.valueOf(text), xPos, yPos, paint); |
|
|
|
return image; |
|
} |
|
|
|
/** |
|
* Creates a rounded square of a certain color with |
|
* a character imprinted in white on it. |
|
* |
|
* @param character the character to write on the image. |
|
* @param width the width of the final image. |
|
* @param height the height of the final image. |
|
* @param color the background color of the rounded square. |
|
* @return a valid bitmap of a rounded square with a character on it. |
|
*/ |
|
@NonNull |
|
public static Bitmap getRoundedLetterImage(@NonNull Character character, int width, int height, int color) { |
|
Bitmap image = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |
|
Canvas canvas = new Canvas(image); |
|
Paint paint = new Paint(); |
|
paint.setColor(color); |
|
Typeface boldText = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD); |
|
paint.setTypeface(boldText); |
|
paint.setTextSize(Utils.dpToPx(14)); |
|
paint.setAntiAlias(true); |
|
paint.setTextAlign(Paint.Align.CENTER); |
|
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OVER)); |
|
|
|
int radius = Utils.dpToPx(2); |
|
|
|
RectF outer = new RectF(0, 0, canvas.getWidth(), canvas.getHeight()); |
|
canvas.drawRoundRect(outer, radius, radius, paint); |
|
|
|
int xPos = (canvas.getWidth() / 2); |
|
int yPos = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)); |
|
|
|
paint.setColor(Color.WHITE); |
|
canvas.drawText(character.toString(), xPos, yPos, paint); |
|
|
|
return image; |
|
} |
|
|
|
/** |
|
* Hashes a character to one of four colors: |
|
* blue, green, red, or orange. |
|
* |
|
* @param character the character to hash. |
|
* @param app the application needed to get the color. |
|
* @return one of the above colors, or black something goes wrong. |
|
*/ |
|
@ColorInt |
|
public static int characterToColorHash(@NonNull Character character, @NonNull Application app) { |
|
int smallHash = Character.getNumericValue(character) % 4; |
|
switch (Math.abs(smallHash)) { |
|
case 0: |
|
return ContextCompat.getColor(app, R.color.bookmark_default_blue); |
|
case 1: |
|
return ContextCompat.getColor(app, R.color.bookmark_default_green); |
|
case 2: |
|
return ContextCompat.getColor(app, R.color.bookmark_default_red); |
|
case 3: |
|
return ContextCompat.getColor(app, R.color.bookmark_default_orange); |
|
default: |
|
return Color.BLACK; |
|
} |
|
} |
|
|
|
|
|
public static int mixColor(float fraction, int startValue, int endValue) { |
|
int startA = (startValue >> 24) & 0xff; |
|
int startR = (startValue >> 16) & 0xff; |
|
int startG = (startValue >> 8) & 0xff; |
|
int startB = startValue & 0xff; |
|
|
|
int endA = (endValue >> 24) & 0xff; |
|
int endR = (endValue >> 16) & 0xff; |
|
int endG = (endValue >> 8) & 0xff; |
|
int endB = endValue & 0xff; |
|
|
|
return (startA + (int) (fraction * (endA - startA))) << 24 | |
|
(startR + (int) (fraction * (endR - startR))) << 16 | |
|
(startG + (int) (fraction * (endG - startG))) << 8 | |
|
(startB + (int) (fraction * (endB - startB))); |
|
} |
|
|
|
public static void setBackground(@NonNull View view, @Nullable Drawable drawable) { |
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { |
|
view.setBackground(drawable); |
|
} else { |
|
//noinspection deprecation |
|
view.setBackgroundDrawable(drawable); |
|
} |
|
} |
|
|
|
}
|
|
|