You need to make sure your View is saveEnabled, try:
setSaveEnabled(true);
You could do this from the constructor of your PaintView.
Also, you may need to make sure that your activities are being destroyed/recreated on orientation change. Make sure you DO NOT have:
<activity name="?"
android:configChanges="keyboardHidden|orientation"
/>
declared for the activity using this View or else the activity won't be destroyed on orientation change. Also, if you have overridden onSaveInstanceState/*onRestoreInstanceState* in those activities you need to call the respective superclass method, either super.onSaveInstanceState() or super.onRestoreInstanceState())
As far as how to actually recreate or save the image for orientation changes how about you save each event that is done in some kind of parcelable List. Save that list in onSaveInstanceState and restore it in onRestoreInstanceState. THen take the list of events and loop through it, calling the respective draw functions. You may need to do some translation of X,Y values based on the new orientation.
The code would look something like this:
public class PaintView extends View {
private static final String EXTRA_EVENT_LIST = "event_list";
private static final String EXTRA_STATE = "instance_state";
private ArrayList<MotionEvent> eventList = new ArrayList<MotionEvent>(100);
@Override
public boolean onTouchEvent(MotionEvent event) {
getParent().requestDisallowInterceptTouchEvent(true);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
performTouchEvent(event);
}
return true;
}
private void performTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
break;
case MotionEvent.ACTION_UP:
touch_up();
break;
}
invalidate();
eventList.add(MotionEvent.obtain(event));
}
}
@Override
public Parcelable onSaveInstanceState()
{
System.out.println("save instance");
Bundle bundle = new Bundle();
bundle.putParcelable(EXTRA_STATE, super.onSaveInstanceState());
bundle.putParcelableArrayList(EXTRA_EVENT_LIST, eventList);
return bundle;
}
@Override
public void onRestoreInstanceState(Parcelable state)
{
if (state instanceof Bundle)
{
Bundle bundle = (Bundle) state;
super.onRestoreInstanceState(bundle.getParcelable(EXTRA_STATE));
eventList = bundle.getParcelableArrayList(EXTRA_EVENT_LIST);
if (eventList == null) {
eventList = new ArrayList<MotionEvent>(100);
}
for (MotionEvent event : eventList) {
performTouchEvent(event);
}
return;
}
super.onRestoreInstanceState(state);
}
}