Skip to content

Instantly share code, notes, and snippets.

@Binary-Finery
Created December 5, 2018 20:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Binary-Finery/99866ce8b0984ed2dd7fa30e212a6992 to your computer and use it in GitHub Desktop.
Save Binary-Finery/99866ce8b0984ed2dd7fa30e212a6992 to your computer and use it in GitHub Desktop.
retro pixel art
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PointF;
import android.view.MotionEvent;
import android.view.View;
import spencerstudios.com.jetdblib.JetDB;
@SuppressLint("ViewConstructor")
class PaintingView extends View {
private float cell_size;
private float touch_x = 0;
private float touch_y = 0;
private float canvas_sqr_root;
private float x_cells;
private Paint[] paints;
private PointF[] points;
private Paint gridPaint;
private boolean showGrid;
private int base_color = Color.rgb(155, 188, 15);
private int selectedColor = Color.rgb(15, 56, 15);
public PaintingView(Context context, float width, int x_cells) {
super(context);
showGrid = JetDB.getBoolean(context, "show_grid");
this.x_cells = x_cells;
this.canvas_sqr_root = width;
int total_cells = x_cells * x_cells;
cell_size = canvas_sqr_root / x_cells;
paints = new Paint[total_cells];
points = new PointF[total_cells];
gridPaint = new Paint();
gridPaint.setColor(Color.WHITE);
gridPaint.setStrokeWidth(1.0f);
offsetXY();
float y_top = 0, x_left = 0;
for (int i = 0; i < points.length; i++) {
paints[i] = new Paint();
paints[i].setColor(base_color);
if (i > 0 && i % x_cells == 0) {
y_top += cell_size;
x_left = 0;
}
points[i] = new PointF(x_left, y_top);
x_left += cell_size;
}
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
touch_x = event.getX();
touch_y = event.getY();
invalidate();
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
boolean found = false;
for (int i = 0; i < points.length; i++) {
float l = points[i].x, t = points[i].y, r = l + cell_size, b = t + cell_size;
if (!found) {
if (touch_x >= l && touch_x <= r && touch_y >= t && touch_y <= b) {
paints[i].setColor(selectedColor);
found = true;
}
}
canvas.drawRect(l, t, l + cell_size, t + cell_size, paints[i]);
}
if (showGrid) {
float left = cell_size, top = cell_size;
for (int i = 0; i < x_cells - 1; i++) {
canvas.drawLine(left, 0, left, canvas_sqr_root, gridPaint);
canvas.drawLine(0, top, canvas_sqr_root, top, gridPaint);
top += cell_size;
left += cell_size;
}
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension((int) canvas_sqr_root, (int) canvas_sqr_root);
}
public void enableGrid(boolean b) {
showGrid = b;
invalidate();
}
public void resetMatrix() {
for (Paint paint : paints) {
paint.setColor(base_color);
}
offsetXY();
invalidate();
}
public Bitmap getCanvasBitmap() {
this.setDrawingCacheEnabled(true);
return this.getDrawingCache();
}
public void setPaintColor(int color) {
selectedColor = color;
}
public void disableDrawingCache() {
this.setDrawingCacheEnabled(false);
}
private void offsetXY() {
touch_y = 0 - (cell_size * cell_size);
touch_x = 0 - (cell_size * cell_size);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment