Skip to content

Commit

Permalink
Merge pull request #9 from dgmltn/TrianglifyDrawable
Browse files Browse the repository at this point in the history
Extracted drawable out of TrianglifyView into TrianglifyDrawable
  • Loading branch information
manolovn committed Mar 22, 2016
2 parents e43bace + 78cd635 commit beaeef8
Show file tree
Hide file tree
Showing 4 changed files with 189 additions and 113 deletions.
16 changes: 8 additions & 8 deletions app/src/main/java/com/manolovn/sample/SampleActivity.java
@@ -1,5 +1,9 @@
package com.manolovn.sample;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
Expand All @@ -11,12 +15,8 @@
import android.widget.Toast;

import com.manolovn.colorbrewer.ColorBrewer;
import com.manolovn.trianglify.TrianglifyView;
import com.manolovn.sample.exporter.ImageExporter;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import com.manolovn.trianglify.TrianglifyView;

import butterknife.Bind;
import butterknife.ButterKnife;
Expand Down Expand Up @@ -82,7 +82,7 @@ public void onStartTrackingTouch(SeekBar seekBar) {
public void onStopTrackingTouch(SeekBar seekBar) {
if (progress > 0) {
trianglifyView.setDrawingCacheEnabled(false);
trianglifyView.setCellSize(progress * 10);
trianglifyView.getDrawable().setCellSize(progress * 10);
trianglifyView.setDrawingCacheEnabled(true);
}
}
Expand All @@ -105,7 +105,7 @@ public void onStartTrackingTouch(SeekBar seekBar) {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
trianglifyView.setDrawingCacheEnabled(false);
trianglifyView.setVariance(progress + 2);
trianglifyView.getDrawable().setVariance(progress + 2);
trianglifyView.setDrawingCacheEnabled(true);
}
});
Expand All @@ -127,7 +127,7 @@ private void initColorControl() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
trianglifyView.setDrawingCacheEnabled(false);
trianglifyView.setColor(colors[position]);
trianglifyView.getDrawable().setColor(colors[position]);
trianglifyView.setDrawingCacheEnabled(true);
}

Expand Down
@@ -0,0 +1,119 @@
package com.manolovn.trianglify;

import java.util.Vector;

import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.PixelFormat;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;

import com.manolovn.colorbrewer.ColorBrewer;
import com.manolovn.trianglify.domain.Point;
import com.manolovn.trianglify.domain.Triangle;
import com.manolovn.trianglify.generator.color.BrewerColorGenerator;
import com.manolovn.trianglify.generator.point.RegularPointGenerator;
import com.manolovn.trianglify.renderer.TriangleRenderer;
import com.manolovn.trianglify.triangulator.DelaunayTriangulator;
import com.manolovn.trianglify.triangulator.Triangulator;

/**
* Created by doug on 3/17/16.
*/
public class TrianglifyDrawable extends Drawable {

private RegularPointGenerator pointGenerator;
private Triangulator triangulator;
private TriangleRenderer triangleRenderer;

private int width;
private int height;

private Vector<Point> points;
private Vector<Triangle> triangles;

// Used with triangulateInBackground
Boolean ready = false;

public TrianglifyDrawable(int cellSize, int variance, int bleedX, int bleedY) {
super();

pointGenerator = new RegularPointGenerator(cellSize, variance);
pointGenerator.setBleedX(bleedX);
pointGenerator.setBleedY(bleedY);
triangulator = new DelaunayTriangulator();
triangleRenderer = new TriangleRenderer();
}

@Override
protected void onBoundsChange(Rect bounds) {
this.width = bounds.width();
this.height = bounds.height();
triangulateInBackground();
}

@Override
public void draw(Canvas canvas) {
if (ready) {
triangleRenderer.render(triangles, canvas);
}
}

@Override
public void setAlpha(int alpha) {

}

@Override
public void setColorFilter(ColorFilter colorFilter) {

}

@Override
public int getOpacity() {
return PixelFormat.OPAQUE;
}

public void setVariance(int variance) {
pointGenerator.setVariance(variance);
triangulateInBackground();
}

public void setCellSize(int cellSize) {
pointGenerator.setCellSize(cellSize);
triangulateInBackground();
}

public void setColor(ColorBrewer color) {
triangleRenderer = new TriangleRenderer(new BrewerColorGenerator(color));
triangulateInBackground();
}

private void triangulateInBackground() {
TriangulateAsyncTask task = new TriangulateAsyncTask();
task.execute();
}

private Object lock = new Object();

private class TriangulateAsyncTask extends AsyncTask<Void, Void, Void> {

@Override
protected Void doInBackground(Void... params) {
synchronized (lock) {
ready = false;
points = pointGenerator.generatePoints(width, height);
triangles = triangulator.triangulate(points);
ready = true;
}
return null;
}

@Override
protected void onPostExecute(Void aVoid) {
invalidateSelf();
}
}

}
154 changes: 51 additions & 103 deletions trianglify/src/main/java/com/manolovn/trianglify/TrianglifyView.java
Expand Up @@ -2,117 +2,65 @@

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;

import com.manolovn.colorbrewer.ColorBrewer;
import com.manolovn.trianglify.domain.Point;
import com.manolovn.trianglify.generator.color.BrewerColorGenerator;
import com.manolovn.trianglify.generator.point.PointGenerator;
import com.manolovn.trianglify.generator.point.RegularPointGenerator;
import com.manolovn.trianglify.renderer.TriangleRenderer;
import com.manolovn.trianglify.domain.Triangle;
import com.manolovn.trianglify.triangulator.DelaunayTriangulator;
import com.manolovn.trianglify.triangulator.Triangulator;

import java.util.Vector;

/**
* Trianglify view
*
* @author manolovn
*/
public class TrianglifyView extends View {

private PointGenerator pointGenerator;
private Triangulator triangulator;
private TriangleRenderer triangleRenderer;

private int width;
private int height;

private int cellSize;
private int variance;
private int bleedX;
private int bleedY;

private Vector<Point> points;
private Vector<Triangle> triangles;

public TrianglifyView(Context context) {
super(context);
init(null);
}

public TrianglifyView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}

public TrianglifyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}

private void init(AttributeSet attrs) {
if (attrs != null) {
parseAttributes(attrs);
}

pointGenerator = new RegularPointGenerator(cellSize, variance);
triangulator = new DelaunayTriangulator();
triangleRenderer = new TriangleRenderer();
}

private void parseAttributes(AttributeSet attrs) {
TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs,
R.styleable.TrianglifyView, 0, 0);

try {
cellSize = a.getInteger(R.styleable.TrianglifyView_cellSize, Default.cellSize);
variance = a.getInteger(R.styleable.TrianglifyView_variance, Default.variance);
bleedX = a.getInteger(R.styleable.TrianglifyView_bleedX, Default.bleedX);
bleedY = a.getInteger(R.styleable.TrianglifyView_bleedY, Default.bleedY);
} finally {
a.recycle();
}
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

width = getMeasuredWidth();
height = getMeasuredHeight();
}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

pointGenerator.setBleedX(bleedX);
pointGenerator.setBleedY(bleedY);
points = pointGenerator.generatePoints(width, height);
triangles = triangulator.triangulate(points);

triangleRenderer.render(triangles, canvas);
}

public void setVariance(int variance) {
this.variance = variance;
pointGenerator = new RegularPointGenerator(cellSize, variance);
invalidate();
}

public void setCellSize(int cellSize) {
this.cellSize = cellSize;
pointGenerator = new RegularPointGenerator(cellSize, variance);
invalidate();
}

public void setColor(ColorBrewer color) {
triangleRenderer = new TriangleRenderer(new BrewerColorGenerator(color));
invalidate();
}
private TrianglifyDrawable drawable;

public TrianglifyView(Context context) {
super(context);
init(null);
}

public TrianglifyView(Context context, AttributeSet attrs) {
super(context, attrs);
init(attrs);
}

public TrianglifyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(attrs);
}

private void init(AttributeSet attrs) {
int cellSize = Default.cellSize;
int variance = Default.variance;
int bleedX = Default.bleedX;
int bleedY = Default.bleedY;

if (attrs != null) {
TypedArray a = getContext().getTheme().obtainStyledAttributes(attrs,
R.styleable.TrianglifyView, 0, 0);

try {
cellSize = a.getInteger(R.styleable.TrianglifyView_cellSize, cellSize);
variance = a.getInteger(R.styleable.TrianglifyView_variance, variance);
bleedX = a.getInteger(R.styleable.TrianglifyView_bleedX, bleedX);
bleedY = a.getInteger(R.styleable.TrianglifyView_bleedY, bleedY);
}
finally {
a.recycle();
}
}

drawable = new TrianglifyDrawable(cellSize, variance, bleedX, bleedY);
setBackgroundDrawable(drawable);
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
drawable.setBounds(0, 0, getMeasuredWidth(), getMeasuredHeight());
}

public TrianglifyDrawable getDrawable() {
return drawable;
}
}
Expand Up @@ -13,8 +13,9 @@
public class RegularPointGenerator implements PointGenerator {

private final Random random = new Random();
private final int cellSize;
private final int variance;

private int cellSize;
private int variance;

private int bleedX = 0;
private int bleedY = 0;
Expand All @@ -34,6 +35,14 @@ public void setBleedY(int bleedY) {
this.bleedY = bleedY;
}

public void setCellSize(int cellSize) {
this.cellSize = cellSize;
}

public void setVariance(int variance) {
this.variance = variance;
}

@Override
public Vector<Point> generatePoints(int width, int height) {
Vector<Point> points = new Vector<>();
Expand Down

0 comments on commit beaeef8

Please sign in to comment.