aboutsummaryrefslogtreecommitdiffstats
path: root/templates/other
diff options
context:
space:
mode:
Diffstat (limited to 'templates/other')
-rw-r--r--templates/other/CustomView/globals.xml.ftl5
-rw-r--r--templates/other/CustomView/recipe.xml.ftl13
-rwxr-xr-xtemplates/other/CustomView/root/res/layout/sample.xml.ftl18
-rwxr-xr-xtemplates/other/CustomView/root/res/values/attrs.xml.ftl8
-rw-r--r--templates/other/CustomView/root/src/app_package/CustomView.java.ftl181
-rw-r--r--templates/other/CustomView/template.xml26
6 files changed, 251 insertions, 0 deletions
diff --git a/templates/other/CustomView/globals.xml.ftl b/templates/other/CustomView/globals.xml.ftl
new file mode 100644
index 0000000..d2eeb40
--- /dev/null
+++ b/templates/other/CustomView/globals.xml.ftl
@@ -0,0 +1,5 @@
+<?xml version="1.0"?>
+<globals>
+ <global id="srcOut" value="src/${slashedPackageName(packageName)}" />
+ <global id="view_class" value="${camelCaseToUnderscore(viewClass)}" />
+</globals>
diff --git a/templates/other/CustomView/recipe.xml.ftl b/templates/other/CustomView/recipe.xml.ftl
new file mode 100644
index 0000000..d152df0
--- /dev/null
+++ b/templates/other/CustomView/recipe.xml.ftl
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<recipe>
+ <merge from="res/values/attrs.xml.ftl"
+ to="res/values/attrs_${view_class}.xml" />
+ <instantiate from="res/layout/sample.xml.ftl"
+ to="res/layout/sample_${view_class}.xml" />
+
+ <instantiate from="src/app_package/CustomView.java.ftl"
+ to="${srcOut}/${viewClass}.java" />
+
+ <open file="${srcOut}/${viewClass}.java" />
+ <open file="res/layout/sample_${view_class}.xml" />
+</recipe>
diff --git a/templates/other/CustomView/root/res/layout/sample.xml.ftl b/templates/other/CustomView/root/res/layout/sample.xml.ftl
new file mode 100755
index 0000000..bdd8c8b
--- /dev/null
+++ b/templates/other/CustomView/root/res/layout/sample.xml.ftl
@@ -0,0 +1,18 @@
+<FrameLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res/${packageName}"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <${packageName}.${viewClass}
+ android:background="#ccc"
+ android:layout_width="300dp"
+ android:layout_height="300dp"
+ android:paddingLeft="20dp"
+ android:paddingBottom="40dp"
+ app:exampleDimension="24sp"
+ app:exampleColor="#33b5e5"
+ app:exampleString="Hello, ${viewClass}"
+ app:exampleDrawable="@android:drawable/ic_menu_add" />
+
+</FrameLayout> \ No newline at end of file
diff --git a/templates/other/CustomView/root/res/values/attrs.xml.ftl b/templates/other/CustomView/root/res/values/attrs.xml.ftl
new file mode 100755
index 0000000..89059d2
--- /dev/null
+++ b/templates/other/CustomView/root/res/values/attrs.xml.ftl
@@ -0,0 +1,8 @@
+<resources>
+ <declare-styleable name="${viewClass}">
+ <attr name="exampleString" format="string" />
+ <attr name="exampleDimension" format="dimension" />
+ <attr name="exampleColor" format="color" />
+ <attr name="exampleDrawable" format="color|reference" />
+ </declare-styleable>
+</resources>
diff --git a/templates/other/CustomView/root/src/app_package/CustomView.java.ftl b/templates/other/CustomView/root/src/app_package/CustomView.java.ftl
new file mode 100644
index 0000000..e1c7e13
--- /dev/null
+++ b/templates/other/CustomView/root/src/app_package/CustomView.java.ftl
@@ -0,0 +1,181 @@
+package ${packageName};
+
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.graphics.drawable.Drawable;
+import android.text.TextPaint;
+import android.util.AttributeSet;
+import android.view.View;
+
+/**
+ * TODO: document your custom view class.
+ */
+public class ${viewClass} extends View {
+ private String mExampleString; // TODO: use a default from R.string...
+ private int mExampleColor = Color.RED; // TODO: use a default from R.color...
+ private float mExampleDimension = 0; // TODO: use a default from R.dimen...
+ private Drawable mExampleDrawable;
+
+ private TextPaint mTextPaint;
+ private float mTextWidth;
+ private float mTextHeight;
+
+ public ${viewClass}(Context context) {
+ super(context);
+ init(null, 0);
+ }
+
+ public ${viewClass}(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs, 0);
+ }
+
+ public ${viewClass}(Context context, AttributeSet attrs, int defStyle) {
+ super(context, attrs, defStyle);
+ init(attrs, defStyle);
+ }
+
+ private void init(AttributeSet attrs, int defStyle) {
+ // Load attributes
+ final TypedArray a = getContext().obtainStyledAttributes(
+ attrs, R.styleable.${viewClass}, defStyle, 0);
+
+ mExampleString = a.getString(
+ R.styleable.${viewClass}_exampleString);
+ mExampleColor = a.getColor(
+ R.styleable.${viewClass}_exampleColor,
+ mExampleColor);
+ // Use getDimensionPixelSize or getDimensionPixelOffset when dealing with
+ // values that should fall on pixel boundaries.
+ mExampleDimension = a.getDimension(
+ R.styleable.${viewClass}_exampleDimension,
+ mExampleDimension);
+
+ if (a.hasValue(R.styleable.${viewClass}_exampleDrawable)) {
+ mExampleDrawable = a.getDrawable(
+ R.styleable.${viewClass}_exampleDrawable);
+ mExampleDrawable.setCallback(this);
+ }
+
+ a.recycle();
+
+ // Set up a default TextPaint object
+ mTextPaint = new TextPaint();
+ mTextPaint.setFlags(Paint.ANTI_ALIAS_FLAG);
+ mTextPaint.setTextAlign(Paint.Align.LEFT);
+
+ // Update TextPaint and text measurements from attributes
+ invalidateTextPaintAndMeasurements();
+ }
+
+ private void invalidateTextPaintAndMeasurements() {
+ mTextPaint.setTextSize(mExampleDimension);
+ mTextPaint.setColor(mExampleColor);
+ mTextWidth = mTextPaint.measureText(mExampleString);
+
+ Paint.FontMetrics fontMetrics = mTextPaint.getFontMetrics();
+ mTextHeight = fontMetrics.bottom;
+ }
+
+ @Override
+ protected void onDraw(Canvas canvas) {
+ super.onDraw(canvas);
+
+ // TODO: consider storing these as member variables to reduce
+ // allocations per draw cycle.
+ int paddingLeft = getPaddingLeft();
+ int paddingTop = getPaddingTop();
+ int paddingRight = getPaddingRight();
+ int paddingBottom = getPaddingBottom();
+
+ int contentWidth = getWidth() - paddingLeft - paddingRight;
+ int contentHeight = getHeight() - paddingTop - paddingBottom;
+
+ // Draw the text.
+ canvas.drawText(mExampleString,
+ paddingLeft + (contentWidth - mTextWidth) / 2,
+ paddingTop + (contentHeight + mTextHeight) / 2,
+ mTextPaint);
+
+ // Draw the example drawable on top of the text.
+ if (mExampleDrawable != null) {
+ mExampleDrawable.setBounds(paddingLeft, paddingTop,
+ paddingLeft + contentWidth, paddingTop + contentHeight);
+ mExampleDrawable.draw(canvas);
+ }
+ }
+
+ /**
+ * Gets the example string attribute value.
+ * @return The example string attribute value.
+ */
+ public String getExampleString() {
+ return mExampleString;
+ }
+
+ /**
+ * Sets the view's example string attribute value. In the example view, this string
+ * is the text to draw.
+ * @param exampleString The example string attribute value to use.
+ */
+ public void setExampleString(String exampleString) {
+ mExampleString = exampleString;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example color attribute value.
+ * @return The example color attribute value.
+ */
+ public int getExampleColor() {
+ return mExampleColor;
+ }
+
+ /**
+ * Sets the view's example color attribute value. In the example view, this color
+ * is the font color.
+ * @param exampleColor The example color attribute value to use.
+ */
+ public void setExampleColor(int exampleColor) {
+ mExampleColor = exampleColor;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example dimension attribute value.
+ * @return The example dimension attribute value.
+ */
+ public float getExampleDimension() {
+ return mExampleDimension;
+ }
+
+ /**
+ * Sets the view's example dimension attribute value. In the example view, this dimension
+ * is the font size.
+ * @param exampleDimension The example dimension attribute value to use.
+ */
+ public void setExampleDimension(float exampleDimension) {
+ mExampleDimension = exampleDimension;
+ invalidateTextPaintAndMeasurements();
+ }
+
+ /**
+ * Gets the example drawable attribute value.
+ * @return The example drawable attribute value.
+ */
+ public Drawable getExampleDrawable() {
+ return mExampleDrawable;
+ }
+
+ /**
+ * Sets the view's example drawable attribute value. In the example view, this drawable is
+ * drawn above the text.
+ * @param exampleDrawable The example drawable attribute value to use.
+ */
+ public void setExampleDrawable(Drawable exampleDrawable) {
+ mExampleDrawable = exampleDrawable;
+ }
+}
diff --git a/templates/other/CustomView/template.xml b/templates/other/CustomView/template.xml
new file mode 100644
index 0000000..9511566
--- /dev/null
+++ b/templates/other/CustomView/template.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<template
+ name="New Custom View"
+ description="Creates a new custom view that extends android.view.View, and exposes custom attributes.">
+
+ <category value="UI Components" />
+
+ <parameter
+ id="packageName"
+ name="Package name"
+ type="string"
+ constraints="package"
+ default="com.mycompany.myapp" />
+
+ <parameter
+ id="viewClass"
+ name="View Class"
+ type="string"
+ constraints="class|unique"
+ default="MyView"
+ help="By convention, should end in 'View'" />
+
+ <globals file="globals.xml.ftl" />
+ <execute file="recipe.xml.ftl" />
+
+</template> \ No newline at end of file