Drag and Drop inside a grid

You choose an feature (such as colour or number of turns or style), then choose the option within it. The Greek Key appears.

Stringsapp/res/values/strings.xml
Screen formatapp/res/layout/activity_main.xml
Code for appapp/java/com.(the project name)/MainActivity
Code for gridviewapp/java/com.(the project name)/ImageGrid



app/res/drawable - pictures

Various pictures, which the code will load into an array for manipulation.




app/res/values/strings.xml - strings

<resources> <string name="app_name">Photo Gallery</string> <string name="desc">Just to prove the grid doesn\'t have to be at the top of the screen</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"> <TextView android:id="@+id/gmVal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/desc" /> <GridView android:id="@+id/gridView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:paddingTop="@dimen/activity_vertical_margin" android:paddingBottom="@dimen/activity_vertical_margin" android:numColumns="5" android:layout_below="@id/gmVal" /> </RelativeLayout>


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

package com.edkins.photogallery; import android.support.v4.view.MotionEventCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.GridView; public class MainActivity extends AppCompatActivity implements View.OnTouchListener { public static int[] photo = { R.drawable.lion1, R.drawable.lion2, R.drawable.lion3, R.drawable.lion4, R.drawable.virgin1, R.drawable.virgin2, R.drawable.virgin3, R.drawable.virgin4, R.drawable.virgin5, R.drawable.virgin6, }; public static int [] newOrder = new int [photo.length]; public static int [] xy = new int [2]; public static int cols=5; public static int width; public static int fromSub=-1; public static int toSub=-1; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); GridView gridV = (GridView) findViewById(R.id.gridView); gridV.setNumColumns(cols); gridV.setAdapter(new ImageGrid(this)); gridV.setOnTouchListener(this); if (newOrder[0]==0) {System.arraycopy(photo, 0, newOrder,0, photo.length);} } public boolean onTouchEvent(MotionEvent ev) { final int action = MotionEventCompat.getActionMasked(ev); if (action==MotionEvent.ACTION_DOWN) { final float x = ev.getRawX(); final float y = ev.getRawY(); fromSub = findSub(x, y); } else if (action==MotionEvent.ACTION_MOVE) { final float x = ev.getRawX(); final float y = ev.getRawY(); toSub = findSub (x,y); if (toSub!=-1 && fromSub!=-1) if (toSub!=fromSub) { int save = newOrder [fromSub]; if (fromSub < toSub) { System.arraycopy(newOrder, fromSub+1, newOrder,fromSub, toSub-fromSub); } else { System.arraycopy(newOrder, fromSub-1, newOrder,fromSub, fromSub-toSub); } newOrder[toSub] = save; GridView gridV = (GridView) findViewById(R.id.gridView); gridV.setAdapter(new ImageGrid(this)); fromSub=toSub; } } return true; } public boolean onTouch(View v, MotionEvent event) { onTouchEvent(event); return true; } public int findSub (float x, float y) { GridView gridV = (GridView) findViewById(R.id.gridView); gridV.getLocationInWindow(xy); int x2 = (int) (x-xy[0]); int y2 = (int) (y-xy[1]); x2 = x2 / width; y2 = y2 / width; int sub = y2 * cols + x2; if (sub<0 || sub>=newOrder.length) {sub=-1;} return sub; } }


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

package com.edkins.photogallery; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.GridView; import android.widget.ImageView; public class ImageGrid extends BaseAdapter { private AppCompatActivity mContext; public ImageGrid(AppCompatActivity c) {mContext = c;} public int getCount() {return MainActivity.newOrder.length;} public Object getItem(int position) {return null;} public long getItemId(int position) {return 0;} public View getView(int position, View convertView, ViewGroup parent) { ImageView imageView; if (convertView == null) { imageView = new ImageView(mContext); GridView grid = (GridView) mContext.findViewById(R.id.gridView); MainActivity.width = grid.getWidth() / MainActivity.cols; imageView.setLayoutParams(new GridView.LayoutParams(MainActivity.width, MainActivity.width)); } else { imageView = (ImageView) convertView; } imageView.setImageResource(MainActivity.newOrder[position]); return imageView; } }


Index to my other websites

© Jo Edkins 2016