Tesselations

You chose a colour, then click in a grid. The resulting design gets repeated.

Stringsapp/res/values/strings.xml
Screen formatapp/res/layout/activity_main.xml
Code for appapp/java/com.(the project name)/MainActivity
Code for palette gridviewapp/java/com.(the project name)/ImagePalette
Code for tile gridviewapp/java/com.(the project name)/ImageTile
Code for repeat gridviewapp/java/com.(the project name)/ImageRepeat



app/manifests/AndroidManifest.xml - to force orientation

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.edkins.mosaic" > <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme" > <activity android:name=".MainActivity" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>


app/res/drawable - pictures

There are a number of colour files, called "colour0", "colour1", "colour2" etc. They are loaded into an array defined in in app/java/com.(the project name)/MainActivity and used in app/java/com.(the project name)/ImagePalette and app/java/com.(the project name)/ImageTile. The number of them (10) is referenced in app/res/layout/activity_main.xml.

There is also a smaller version of each colour file, called "colour0sm" etc. used in app/java/com.(the project name)/ImageRepeat.




app/res/mipmap/ic_launcher.png/ - icon for launching app




app/res/values/strings.xml - strings

<resources> <string name="app_name">Tessellations</string> <string name="howTo">Choose colour, tap in grid.</string> <string name="clearMessage">new</string> <string name="wideString">wide</string> <string name="deepString">deep</string> <string name="num1">1</string> <string name="num2">2</string> <string name="num3">3</string> <string name="num4">4</string> <string name="num5">5</string> <string name="num6">6</string> </resources>


app/res/layout/activity_main.xml - screen format

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> <GridView android:id="@+id/paletteView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numColumns="10" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/howTo" android:layout_below="@id/paletteView" /> <TextView android:id="@+id/wideMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="4dp" android:text="@string/wideString" android:layout_below="@id/message" /> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/width" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:layout_below="@id/message" android:layout_toRightOf="@id/wideMessage" android:layout_toEndOf="@id/wideMessage" > <RadioButton android:id="@+id/width1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num1" android:onClick="clickWide1" /> <RadioButton android:id="@+id/width2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num2" android:onClick="clickWide2" /> <RadioButton android:id="@+id/width3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num3" android:onClick="clickWide3" /> <RadioButton android:id="@+id/width4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num4" android:onClick="clickWide4" /> <RadioButton android:id="@+id/width5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num5" android:onClick="clickWide5" /> <RadioButton android:id="@+id/width6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num6" android:onClick="clickWide6" /> </RadioGroup> <TextView android:id="@+id/deepMessage" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/deepString" android:layout_below="@id/wideMessage" /> <RadioGroup xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/depth" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:layout_below="@id/width" android:layout_toRightOf="@id/deepMessage" android:layout_toEndOf="@id/deepMessage" > <RadioButton android:id="@+id/depth1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num1" android:onClick="clickDeep1" /> <RadioButton android:id="@+id/depth2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num2" android:onClick="clickDeep2" /> <RadioButton android:id="@+id/depth3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num3" android:onClick="clickDeep3" /> <RadioButton android:id="@+id/depth4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num4" android:onClick="clickDeep4" /> <RadioButton android:id="@+id/depth5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num5" android:onClick="clickDeep5" /> <RadioButton android:id="@+id/depth6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/num6" android:onClick="clickDeep6" /> </RadioGroup> <Button android:id="@+id/clearButton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/clearMessage" android:onClick="doClear" android:layout_below="@id/message" android:layout_toRightOf="@id/width" android:layout_toEndOf="@id/width" /> <GridView android:id="@+id/tileView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="@dimen/activity_vertical_margin" android:numColumns="10" android:layout_below="@id/depth" /> <GridView android:id="@+id/repeatView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="@dimen/activity_vertical_margin" android:layout_below="@id/tileView" /> </RelativeLayout>


app/java/com.(the project name)/MainActivity - main code for app

package com.edkins.tessellations; import ... public class MainActivity extends AppCompatActivity { // colour selected - starts as red int paint = 1; public static int wide = 4; public static int deep = 3; public static int tileRow = 10; public static int tileMax = 6; public static int repeatMax = 30; // tiles - for setting up tessera public static int [] tile = new int [6 * 6]; // Colours public static Integer[] palette = { R.drawable.colour0, R.drawable.colour1, R.drawable.colour2, R.drawable.colour3, R.drawable.colour4, R.drawable.colour5, R.drawable.colour6, R.drawable.colour7, R.drawable.colour8, R.drawable.colour9 }; public static Integer[] palettesm = { R.drawable.colour0sm, R.drawable.colour1sm, R.drawable.colour2sm, R.drawable.colour3sm, R.drawable.colour4sm, R.drawable.colour5sm, R.drawable.colour6sm, R.drawable.colour7sm, R.drawable.colour8sm, R.drawable.colour9sm }; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GridView palette = (GridView) findViewById(R.id.paletteView); palette.setAdapter(new ImagePalette(this)); palette.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { processPaletteClick(position); } }); GridView tile = (GridView) findViewById(R.id.tileView); tile.setAdapter(new ImageTile(this)); tile.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { processTileClick(position); } }); GridView repeat = (GridView) findViewById(R.id.repeatView); repeat.setNumColumns(repeatMax); repeat.setAdapter(new ImageRepeat(this)); RadioButton width = (RadioButton) findViewById(R.id.width4); width.setChecked(true); wide = 4; RadioButton depth = (RadioButton) findViewById(R.id.depth3); depth.setChecked(true); deep = 3; } public void processPaletteClick(int position) { paint = position; } public void processTileClick(int position) { int y = position / tileRow; int x = position % tileRow; if (x >= wide) {return;} int tilePosition = y * tileMax + x; if (tile[tilePosition] == paint) {tile[tilePosition]=0;} else {tile[tilePosition] = paint;} redo(); } public void doClear(View view) { for (int i=0; i<(6 * 6); i++) {tile[i] = 0;} redo(); } public void clickWide1(View view) {wide = 1; redo();} public void clickWide2(View view) {wide = 2; redo();} public void clickWide3(View view) {wide = 3; redo();} public void clickWide4(View view) {wide = 4; redo();} public void clickWide5(View view) {wide = 5; redo();} public void clickWide6(View view) {wide = 6; redo();} public void clickDeep1(View view) {deep = 1; redo();} public void clickDeep2(View view) {deep = 2; redo();} public void clickDeep3(View view) {deep = 3; redo();} public void clickDeep4(View view) {deep = 4; redo();} public void clickDeep5(View view) {deep = 5; redo();} public void clickDeep6(View view) {deep = 6; redo();} // redo screen public void redo() { GridView tile = (GridView) findViewById(R.id.tileView); tile.setAdapter(new ImageTile(this)); GridView repeat = (GridView) findViewById(R.id.repeatView); repeat.setAdapter(new ImageRepeat(this)); } }


app/java/com.(the project name)/ImagePalette - code for palette gridview. You create this new file by right-clicking on the MainActvity and select New, then Java class

package com.edkins.tessellations; import ... public class ImagePalette extends BaseAdapter { private AppCompatActivity mContext; public ImagePalette(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.palette.length;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} // create new ImageView for palette public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); } else { imageView = (ImageView) convertView; } // initialise the view element (to one of the colours) imageView.setImageResource(MainActivity.palette[position]); return imageView; } }


app/java/com.(the project name)/ImageTile - code for tile gridview - a new file, see above

package com.edkins.tessellations; import ... public class ImageTile extends BaseAdapter { private AppCompatActivity mContext; public ImageTile(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.tileRow * MainActivity.deep;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} // create new ImageView for tessera public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); GridView tile = (GridView) mContext.findViewById(R.id.tileView); int w = tile.getWidth() / MainActivity.tileRow; imageView.setLayoutParams(new GridView.LayoutParams(w, w)); } else { imageView = (ImageView) convertView; } // initialise the view element (to whatever is in array tile[]) int y = position / MainActivity.tileRow; int x = position % MainActivity.tileRow; if (x < MainActivity.wide) { int sub = MainActivity.tile[y * MainActivity.tileMax + x]; imageView.setImageResource(MainActivity.palette[sub]); } else {imageView.setImageResource(R.drawable.colour0sm);} return imageView; } }


app/java/com.(the project name)/ImageRepeat - code for repeat gridview - a new file, see above

package com.edkins.tessellations; import ... public class ImageRepeat extends BaseAdapter { private AppCompatActivity mContext; public ImageRepeat(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.repeatMax * MainActivity.repeatMax;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} // create new ImageView for palette public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); GridView tile = (GridView) mContext.findViewById(R.id.tileView); int w = tile.getWidth() / MainActivity.repeatMax; imageView.setLayoutParams(new GridView.LayoutParams(w, w)); } else { imageView = (ImageView) convertView; } // initialise the view element (to whatever is in array tile[]) int y = position / MainActivity.repeatMax; y = y % MainActivity.deep; int x = position % MainActivity.repeatMax; x = x % MainActivity.wide; int tilePosition = y * MainActivity.tileMax + x; int sub = MainActivity.tile[tilePosition]; imageView.setImageResource(MainActivity.palettesm[sub]); return imageView; } }


Index to my other websites

© Jo Edkins 2016