Make a mosaic picture

This allows you to make a mosaic by choosing a colour, then clicking in a large grid.
It does things in a slightly long-winded way, which I've subsequently refined for other apps (now I know better - slightly - what I'm doing!).

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 tessera gridviewapp/java/com.(the project name)/ImageTessera



app/manifests/AndroidManifest.xml - to force landscape 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="landscape"> <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 "tessera0", "tessera1", "tessera2" etc. They are referenced in app/java/com.(the project name)/ImageTessera and the number of them (10) is referenced in app/res/layout/activity_main.xml.




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




app/res/values/strings.xml - strings

<resources> <string name="app_name">Mosaic</string> <string name="tesseraName">tessera</string> <string name="howTo">Click on colour, then in grid. Tap again to remove</string> <string name="clearMessage">new</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:id="@+id/relLayout" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity" > <GridView android:id="@+id/paletteView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:columnWidth="80dp" android:numColumns="10" /> <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/paletteView" /> <TextView android:id="@+id/message" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/howTo" android:layout_alignBaseline="@id/clearButton" android:layout_toRightOf="@id/clearButton" android:layout_toEndOf="@id/clearButton" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" /> <GridView android:id="@+id/mosaicView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:numColumns="16" android:layout_below="@id/clearButton" /> </RelativeLayout>


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

package com.edkins.mosaic; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.WindowManager; import android.widget.AdapterView; import android.widget.GridView; import android.widget.ImageView; public class MainActivity extends Activity { int paint = 1; int tileMax = 400; static int [] tile = new int [400]; static MainActivity theMainActivity; protected void onCreate(Bundle savedInstanceState) { theMainActivity = this; super.onCreate(savedInstanceState); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 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 mosaic = (GridView) findViewById(R.id.mosaicView); mosaic.setAdapter(new ImageTessera(this)); mosaic.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View v, int position, long id) { processMosaicClick(v, position); } }); } public void processPaletteClick(int position) { paint = position; } public void processMosaicClick(View v, int position) { if (tile[position] == paint) {tile[position] = 0;} else {tile[position] = paint;} String fileName = getString(R.string.tesseraName); fileName = fileName + String.format("%01d", tile[position]); int resrcId = getResources().getIdentifier(fileName, "drawable", getPackageName()); ((ImageView) v).setImageResource(resrcId); } public void doClear(View view) { for (int i=0; i<tileMax; i++) {tile[i] = 0;} GridView mosaic = (GridView) findViewById(R.id.mosaicView); mosaic.setAdapter(new ImageTessera(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.mosaic; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class ImagePalette extends BaseAdapter { private Context mContext; public ImagePalette(Context c) {mContext = c;} public int getCount() {return tessera.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(tessera[position]); return imageView; } // Colours - initialises palette private Integer[] tessera = { R.drawable.tesserac, R.drawable.tessera1, R.drawable.tessera2, R.drawable.tessera3, R.drawable.tessera4, R.drawable.tessera5, R.drawable.tessera6, R.drawable.tessera7, R.drawable.tessera8, R.drawable.tessera9 }; }


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

package com.edkins.mosaic; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; import android.widget.RelativeLayout; public class ImageTessera extends BaseAdapter { private Context mContext; public ImageTessera(Context c) {mContext = c;} public int getCount() {return 400;} 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; Context context = parent.getContext(); if (convertView == null) { imageView = new ImageView(mContext); RelativeLayout rel = (RelativeLayout) MainActivity.theMainActivity.findViewById(R.id.relLayout); int w = rel.getWidth() / 16; imageView.setLayoutParams(new GridView.LayoutParams(w, w)); } else { imageView = (ImageView) convertView; } //set the tile to whatever is in the array (so we can scroll) String fileName = "tessera" + MainActivity.tile[position]; int id = MainActivity.theMainActivity.getResources().getIdentifier(fileName, "drawable", context.getPackageName()); imageView.setImageResource(id); return imageView; } }


Index to my other websites

© Jo Edkins 2016