Android:尝试调用一个空对象引用的虚拟方法
我有一些问题。在我的代码中,我试图在屏幕旋转时重新绘制绘制在黑板上的图形。但我得到了空对象引用异常 在我的代码中,位图是一个位图数组列表 这是我的saveInstanceState代码Android:尝试调用一个空对象引用的虚拟方法,android,android-canvas,android-orientation,android-bitmap,android-savedstate,Android,Android Canvas,Android Orientation,Android Bitmap,Android Savedstate,我有一些问题。在我的代码中,我试图在屏幕旋转时重新绘制绘制在黑板上的图形。但我得到了空对象引用异常 在我的代码中,位图是一个位图数组列表 这是我的saveInstanceState代码 @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); bitArrayStore(j); outState.putParcelableArra
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitArrayStore(j);
outState.putParcelableArrayList("Bits", bitmaps);
outState.putInt("j", j);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
bitmaps=savedInstanceState.getParcelableArrayList("Bits");
j = savedInstanceState.getInt("j");
redraww();
}
这里是bitArrayStore()
这是我的onRestoreInstanceState代码
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitArrayStore(j);
outState.putParcelableArrayList("Bits", bitmaps);
outState.putInt("j", j);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
bitmaps=savedInstanceState.getParcelableArrayList("Bits");
j = savedInstanceState.getInt("j");
redraww();
}
我的重画方法
public void redraww()
{
try{
drawView.redraw(bitmaps, j);
}catch (IndexOutOfBoundsException e){
drawView.startNew();
}
}
redraw()方法(这里是我获取异常的地方,我已经记录了它)
图形在屏幕旋转时未重新绘制,而是出现此异常。我无法解决此问题。请帮忙
编辑:我的程序java代码
NewNote.java
public class NewNote extends AppCompatActivity implements View.OnClickListener {
private DrawingView drawView;
private ImageButton currPaint;
private float smallBrush = 5, mediumBrush = 10, largeBrush = 30;
String ucolor;
int i = 0, j = 0;
private boolean flag = false, flag1 = false;
ArrayList<Bitmap> bitmaps;
Bitmap[] bits;
@Bind(R.id.colornsize)
ViewGroup colorNsize;
@Bind(R.id.eraserdrawer)
ViewGroup eraserDrawer;
@Bind(R.id.blue_paint)
ImageButton bluePaint;
@Bind(R.id.small_brush)
ImageButton smallBtn;
@Bind(R.id.medium_brush)
ImageButton mediumBtn;
@Bind(R.id.large_brush)
ImageButton largeBtn;
@Bind(R.id.small_eraser)
ImageButton smallEraser;
@Bind(R.id.medium_eraser)
ImageButton mediumEraser;
@Bind(R.id.large_eraser)
ImageButton largeEraser;
@Bind(R.id.bottom_drawer)
ViewGroup btm;
@Bind(R.id.previousbtn)
ImageButton previousBtn;
@Bind(R.id.nextbtn)
ImageButton nextBtn;
@Bind(R.id.framelayout)
FrameLayout frameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notespage_newnote);
ButterKnife.bind(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawView = (DrawingView) findViewById(R.id.drawing);
currPaint = bluePaint;
currPaint.setImageResource(R.drawable.paint_pressed);
smallBrush = getResources().getInteger(R.integer.small_size);
mediumBrush = getResources().getInteger(R.integer.medium_size);
largeBrush = getResources().getInteger(R.integer.large_size);
drawView.setBrushSize(mediumBrush);
bitmaps = new ArrayList<Bitmap>();
bits = new Bitmap[40];
drawView.setDrawingCacheEnabled(true);
smallBtn.setOnClickListener(this);
mediumBtn.setOnClickListener(this);
largeBtn.setOnClickListener(this);
smallEraser.setOnClickListener(this);
mediumEraser.setOnClickListener(this);
largeEraser.setOnClickListener(this);
previousBtn.setOnClickListener(this);
nextBtn.setOnClickListener(this);
drawView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
btm.setVisibility(View.GONE);
break;
case MotionEvent.ACTION_UP:
btm.setVisibility(View.VISIBLE);
break;
default:
return false;
}
return false;
}
});
}
public void paintClicked(View view) {
//use chosen color
drawView.setErase(false);
drawView.setBrushSize(drawView.getLastBrushSize());
if (view != currPaint) {
//update color
ImageButton imgView = (ImageButton) view;
String color = view.getTag().toString();
drawView.setColor(color);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint));
currPaint = (ImageButton) view;
}
hideDrawer(colorNsize);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.newnote_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.clear_menuitem) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
newDialog.setTitle("Clear Board");
newDialog.setMessage("Do you want to clear the board (you will lose the current drawing)?");
newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
drawView.startNew();
bitmaps.remove(j);
flag1 = true;
dialog.dismiss();
}
});
newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
newDialog.show();
return true;
} else if (id == R.id.save_menuitem) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
bitArrayStore(j);
int k = 0;
try {
while (k <= bitmaps.size()) {
Bitmap m = null;
m = bitmaps.get(k);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(path + File.separator + "Pictures" + File.separator + k + "_image.png");
FileOutputStream ostream;
try {
file.createNewFile();
ostream = new FileOutputStream(file);
m.compress(Bitmap.CompressFormat.PNG, 100, ostream);
ostream.flush();
ostream.close();
final Snackbar snackbar = Snackbar.make(frameLayout, "Note Saved", Snackbar.LENGTH_LONG);
snackbar.setAction("Close", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
});
snackbar.show();
} catch (Exception e) {
e.printStackTrace();
Log.w("Skoolify", e);
}
k = k + 1;
}
} catch (IndexOutOfBoundsException e) {
Log.w("Skoolify", "OutOFBonds");
}
return true;
} else if (id == R.id.brush_menuitem) {
if (colorNsize.getVisibility() == View.VISIBLE) {
hideDrawer(colorNsize);
} else {
hideDrawer(eraserDrawer);
showDrawer(colorNsize);
}
return true;
} else if (id == R.id.eraser_menuitem) {
if (eraserDrawer.getVisibility() == View.VISIBLE) {
hideDrawer(eraserDrawer);
} else {
hideDrawer(colorNsize);
showDrawer(eraserDrawer);
}
return true;
}
else if(id==R.id.delete_menuitem){
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
newDialog.setTitle("Discard the Notes");
newDialog.setMessage("Do you want to discard the unsaved notes?");
newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
NewNote.this.finish();
dialog.dismiss();
}
});
newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
newDialog.show();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.small_brush) {
drawView.setBrushSize(smallBrush);
drawView.setLastBrushSize(smallBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.medium_brush) {
drawView.setBrushSize(mediumBrush);
drawView.setLastBrushSize(mediumBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.large_brush) {
drawView.setBrushSize(largeBrush);
drawView.setLastBrushSize(largeBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.small_eraser) {
drawView.setErase(true);
drawView.setBrushSize(smallBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.medium_eraser) {
drawView.setErase(true);
drawView.setBrushSize(mediumBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.large_eraser) {
drawView.setErase(true);
drawView.setBrushSize(largeBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.previousbtn) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
try {
bitArrayStore(j);
drawView.startNew();
j--;
if (bitmaps.size() > j) {
drawView.redraw(bitmaps, j);
}
} catch (IndexOutOfBoundsException e) {
j = 0;
try {
drawView.redraw(bitmaps, j);
}catch (IndexOutOfBoundsException e1){
drawView.startNew();
}
}
flag = false;
} else if (v.getId() == R.id.nextbtn) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
if (j < 50) {
bitArrayStore(j);
if (flag == false) {
j++;
}
if (bitmaps.size() > j) {
drawView.startNew();
drawView.redraw(bitmaps, j);
} else {
drawView.startNew();
}
flag = false;
} else {
Snackbar.make(v, "Reached page limit. Please save and start new note", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
}
public void bitArrayStore(int k) {
if (drawView.canvasBitmap.sameAs(drawView.emptyBitmap)) {
flag = true;
} else {
try {
if (flag1 == false) {
drawView.buildDrawingCache();
drawView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
bitmaps.set(k, Bitmap.createBitmap(drawView.getDrawingCache()));
} else {
bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
flag1 = false;
}
} catch (IndexOutOfBoundsException e) {
bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
}
drawView.destroyDrawingCache();
}
}
public void redraww()
{
try{
drawView.redraw(bitmaps, j);
}catch (IndexOutOfBoundsException e){
drawView.startNew();
}
}
public void hideDrawer(ViewGroup viewgrp) {
viewgrp.setVisibility(View.GONE);
}
public void showDrawer(ViewGroup viewgrp) {
viewgrp.setVisibility(View.VISIBLE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitArrayStore(j);
outState.putParcelableArrayList("Bits", bitmaps);
outState.putInt("j", j);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
bitmaps=savedInstanceState.getParcelableArrayList("Bits");
j = savedInstanceState.getInt("j");
redraww();
}
}
public类NewNote扩展AppCompative活动实现View.OnClickListener{
私有DrawingView drawView;
私人图像处理;
私人浮动小刷子=5,中等刷子=10,大刷子=30;
彩色线;
int i=0,j=0;
私有布尔标志=false,标志1=false;
阵列列表位图;
位图[]位;
@绑定(R.id.colornsize)
视图组颜色化;
@绑定(R.id.橡皮擦绘图器)
视图组橡皮擦绘图器;
@绑定(R.id.蓝色油漆)
蓝漆;
@绑定(R.id.小刷)
图像按钮;
@绑定(R.id.中刷)
ImageButton mediumBtn;
@绑定(R.id.大刷)
图像按钮大;
@绑定(R.id.small_橡皮擦)
图像擦除器;
@绑定(R.id.medium\u橡皮擦)
图像按钮式中继器;
@绑定(R.id.large_橡皮擦)
图像按钮放大镜;
@绑定(右id底部抽屉)
视图组btm;
@绑定(R.id.previousbtn)
ImageButton-previousBtn;
@绑定(R.id.nextbtn)
图像按钮nextBtn;
@绑定(R.id.framelayout)
框架布局框架布局;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.notespage_newnote);
把(这个)绑起来;
Toolbar Toolbar=(Toolbar)findViewById(R.id.Toolbar);
设置支持操作栏(工具栏);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawView=(DrawingView)findViewById(R.id.drawing);
currPaint=蓝色颜料;
currPaint.setImageResource(R.drawable.paint_pressed);
smallBrush=getResources().getInteger(R.integer.small\u size);
mediumBrush=getResources().getInteger(R.integer.medium\u size);
largeBrush=getResources().getInteger(R.integer.large_size);
drawView.Size(mediumBrush);
位图=新的ArrayList();
位=新位图[40];
drawView.setDrawingCacheEnabled(true);
smallBtn.setOnClickListener(此);
mediumBtn.setOnClickListener(此);
largeBtn.setOnClickListener(此);
smallEraser.setOnClickListener(此);
mediumEraser.setOnClickListener(此);
largeEraser.setOnClickListener(此);
上一个btn.setOnClickListener(此);
nextBtn.setOnClickListener(此);
drawView.setOnTouchListener(新视图.OnTouchListener(){
@凌驾
公共布尔onTouch(视图v,运动事件){
开关(event.getAction()){
case MotionEvent.ACTION\u DOWN:
btm.setVisibility(View.GONE);
打破
case MotionEvent.ACTION\u UP:
btm.setVisibility(View.VISIBLE);
打破
违约:
返回false;
}
返回false;
}
});
}
已单击公共空视图(视图){
//使用选定的颜色
drawView.setErase(false);
setBrushSize(drawView.getLastBrushSize());
如果(视图!=currPaint){
//更新颜色
ImageButton imgView=(ImageButton)视图;
字符串颜色=view.getTag().toString();
drawView.setColor(颜色);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
setImageDrawable(getResources().getDrawable(R.drawable.paint));
currPaint=(图像按钮)视图;
}
hideDrawer(彩色);
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
getMenuInflater().充气(R.menu.newnote\u菜单,菜单);
返回true;
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
//处理操作栏项目单击此处。操作栏将
//自动处理Home/Up按钮上的点击,只要
//在AndroidManifest.xml中指定父活动时。
int id=item.getItemId();
//noinspection SimplifiableIf语句
if(id==R.id.clear\u menuitem){
hideDrawer(彩色);
hideDrawer(橡皮擦绘图器);
AlertDialog.Builder newDialog=新建AlertDialog.Builder(此);
newDialog.setTitle(“清除板”);
newDialog.setMessage(“是否要清除电路板(您将丢失当前图形)?”;
newDialog.setPositiveButton(“是”,新建DialogInterface.OnClickListener(){
public void onClick(DialogInterface dialog,int which){
drawView.startNew();
位图。删除(j);
flag1=真;
dialog.dismise();
}
});
newDialog.setNegativeButton(“取消”,新建DialogInterface.OnClickListener()){
public void onClick(DialogInterface dialog,int which){
dialog.cancel();
}
});
newDialog.show();
返回true;
}else if(id==R.id.save\u menuitem){
hideDrawer(彩色);
hideDrawer(橡皮擦绘图器);
bitArrayStore(j);
int k=0;
试一试{
虽然
public class NewNote extends AppCompatActivity implements View.OnClickListener {
private DrawingView drawView;
private ImageButton currPaint;
private float smallBrush = 5, mediumBrush = 10, largeBrush = 30;
String ucolor;
int i = 0, j = 0;
private boolean flag = false, flag1 = false;
ArrayList<Bitmap> bitmaps;
Bitmap[] bits;
@Bind(R.id.colornsize)
ViewGroup colorNsize;
@Bind(R.id.eraserdrawer)
ViewGroup eraserDrawer;
@Bind(R.id.blue_paint)
ImageButton bluePaint;
@Bind(R.id.small_brush)
ImageButton smallBtn;
@Bind(R.id.medium_brush)
ImageButton mediumBtn;
@Bind(R.id.large_brush)
ImageButton largeBtn;
@Bind(R.id.small_eraser)
ImageButton smallEraser;
@Bind(R.id.medium_eraser)
ImageButton mediumEraser;
@Bind(R.id.large_eraser)
ImageButton largeEraser;
@Bind(R.id.bottom_drawer)
ViewGroup btm;
@Bind(R.id.previousbtn)
ImageButton previousBtn;
@Bind(R.id.nextbtn)
ImageButton nextBtn;
@Bind(R.id.framelayout)
FrameLayout frameLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.notespage_newnote);
ButterKnife.bind(this);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
drawView = (DrawingView) findViewById(R.id.drawing);
currPaint = bluePaint;
currPaint.setImageResource(R.drawable.paint_pressed);
smallBrush = getResources().getInteger(R.integer.small_size);
mediumBrush = getResources().getInteger(R.integer.medium_size);
largeBrush = getResources().getInteger(R.integer.large_size);
drawView.setBrushSize(mediumBrush);
bitmaps = new ArrayList<Bitmap>();
bits = new Bitmap[40];
drawView.setDrawingCacheEnabled(true);
smallBtn.setOnClickListener(this);
mediumBtn.setOnClickListener(this);
largeBtn.setOnClickListener(this);
smallEraser.setOnClickListener(this);
mediumEraser.setOnClickListener(this);
largeEraser.setOnClickListener(this);
previousBtn.setOnClickListener(this);
nextBtn.setOnClickListener(this);
drawView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
btm.setVisibility(View.GONE);
break;
case MotionEvent.ACTION_UP:
btm.setVisibility(View.VISIBLE);
break;
default:
return false;
}
return false;
}
});
}
public void paintClicked(View view) {
//use chosen color
drawView.setErase(false);
drawView.setBrushSize(drawView.getLastBrushSize());
if (view != currPaint) {
//update color
ImageButton imgView = (ImageButton) view;
String color = view.getTag().toString();
drawView.setColor(color);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.paint_pressed));
currPaint.setImageDrawable(getResources().getDrawable(R.drawable.paint));
currPaint = (ImageButton) view;
}
hideDrawer(colorNsize);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.newnote_menu, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.clear_menuitem) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
newDialog.setTitle("Clear Board");
newDialog.setMessage("Do you want to clear the board (you will lose the current drawing)?");
newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
drawView.startNew();
bitmaps.remove(j);
flag1 = true;
dialog.dismiss();
}
});
newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
newDialog.show();
return true;
} else if (id == R.id.save_menuitem) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
bitArrayStore(j);
int k = 0;
try {
while (k <= bitmaps.size()) {
Bitmap m = null;
m = bitmaps.get(k);
String path = Environment.getExternalStorageDirectory().getAbsolutePath();
File file = new File(path + File.separator + "Pictures" + File.separator + k + "_image.png");
FileOutputStream ostream;
try {
file.createNewFile();
ostream = new FileOutputStream(file);
m.compress(Bitmap.CompressFormat.PNG, 100, ostream);
ostream.flush();
ostream.close();
final Snackbar snackbar = Snackbar.make(frameLayout, "Note Saved", Snackbar.LENGTH_LONG);
snackbar.setAction("Close", new View.OnClickListener() {
@Override
public void onClick(View v) {
snackbar.dismiss();
}
});
snackbar.show();
} catch (Exception e) {
e.printStackTrace();
Log.w("Skoolify", e);
}
k = k + 1;
}
} catch (IndexOutOfBoundsException e) {
Log.w("Skoolify", "OutOFBonds");
}
return true;
} else if (id == R.id.brush_menuitem) {
if (colorNsize.getVisibility() == View.VISIBLE) {
hideDrawer(colorNsize);
} else {
hideDrawer(eraserDrawer);
showDrawer(colorNsize);
}
return true;
} else if (id == R.id.eraser_menuitem) {
if (eraserDrawer.getVisibility() == View.VISIBLE) {
hideDrawer(eraserDrawer);
} else {
hideDrawer(colorNsize);
showDrawer(eraserDrawer);
}
return true;
}
else if(id==R.id.delete_menuitem){
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
AlertDialog.Builder newDialog = new AlertDialog.Builder(this);
newDialog.setTitle("Discard the Notes");
newDialog.setMessage("Do you want to discard the unsaved notes?");
newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
NewNote.this.finish();
dialog.dismiss();
}
});
newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.cancel();
}
});
newDialog.show();
}
return super.onOptionsItemSelected(item);
}
@Override
public void onClick(View v) {
if (v.getId() == R.id.small_brush) {
drawView.setBrushSize(smallBrush);
drawView.setLastBrushSize(smallBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.medium_brush) {
drawView.setBrushSize(mediumBrush);
drawView.setLastBrushSize(mediumBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.large_brush) {
drawView.setBrushSize(largeBrush);
drawView.setLastBrushSize(largeBrush);
drawView.setErase(false);
hideDrawer(colorNsize);
} else if (v.getId() == R.id.small_eraser) {
drawView.setErase(true);
drawView.setBrushSize(smallBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.medium_eraser) {
drawView.setErase(true);
drawView.setBrushSize(mediumBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.large_eraser) {
drawView.setErase(true);
drawView.setBrushSize(largeBrush);
hideDrawer(eraserDrawer);
} else if (v.getId() == R.id.previousbtn) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
try {
bitArrayStore(j);
drawView.startNew();
j--;
if (bitmaps.size() > j) {
drawView.redraw(bitmaps, j);
}
} catch (IndexOutOfBoundsException e) {
j = 0;
try {
drawView.redraw(bitmaps, j);
}catch (IndexOutOfBoundsException e1){
drawView.startNew();
}
}
flag = false;
} else if (v.getId() == R.id.nextbtn) {
hideDrawer(colorNsize);
hideDrawer(eraserDrawer);
if (j < 50) {
bitArrayStore(j);
if (flag == false) {
j++;
}
if (bitmaps.size() > j) {
drawView.startNew();
drawView.redraw(bitmaps, j);
} else {
drawView.startNew();
}
flag = false;
} else {
Snackbar.make(v, "Reached page limit. Please save and start new note", Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
}
}
public void bitArrayStore(int k) {
if (drawView.canvasBitmap.sameAs(drawView.emptyBitmap)) {
flag = true;
} else {
try {
if (flag1 == false) {
drawView.buildDrawingCache();
drawView.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
bitmaps.set(k, Bitmap.createBitmap(drawView.getDrawingCache()));
} else {
bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
flag1 = false;
}
} catch (IndexOutOfBoundsException e) {
bitmaps.add(k, Bitmap.createBitmap(drawView.getDrawingCache()));
}
drawView.destroyDrawingCache();
}
}
public void redraww()
{
try{
drawView.redraw(bitmaps, j);
}catch (IndexOutOfBoundsException e){
drawView.startNew();
}
}
public void hideDrawer(ViewGroup viewgrp) {
viewgrp.setVisibility(View.GONE);
}
public void showDrawer(ViewGroup viewgrp) {
viewgrp.setVisibility(View.VISIBLE);
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
bitArrayStore(j);
outState.putParcelableArrayList("Bits", bitmaps);
outState.putInt("j", j);
super.onSaveInstanceState(outState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
bitmaps=savedInstanceState.getParcelableArrayList("Bits");
j = savedInstanceState.getInt("j");
redraww();
}
}
public class DrawingView extends View {
//drawing path
private Path drawPath;
//drawing and canvas paint
private Paint drawPaint, canvasPaint;
//initial color
private int paintColor = 0xFF0000c4;
//canvas
private Canvas drawCanvas;
//canvas bitmap
public Bitmap canvasBitmap, emptyBitmap;
private float brushSize, lastBrushSize;
private boolean erase = false;
public DrawingView(Context context, AttributeSet attrs) {
super(context, attrs);
setupDrawing();
}
private void setupDrawing() {
brushSize = getResources().getInteger(R.integer.small_size);
lastBrushSize = brushSize;
drawPath = new Path();
drawPaint = new Paint();
drawPaint.setColor(paintColor);
drawPaint.setAntiAlias(true);
drawPaint.setStrokeWidth(20);
drawPaint.setStyle(Paint.Style.STROKE);
drawPaint.setStrokeJoin(Paint.Join.ROUND);
drawPaint.setStrokeCap(Paint.Cap.ROUND);
canvasPaint = new Paint(Paint.DITHER_FLAG);
}
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
//view given size
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
emptyBitmap = Bitmap.createBitmap(canvasBitmap.getWidth(), canvasBitmap.getHeight(), canvasBitmap.getConfig());
}
@Override
protected void onDraw(Canvas canvas) {
//draw view
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(drawPath, drawPaint);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
//detect user touch
float touchX = event.getX();
float touchY = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
drawPath.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
drawPath.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(drawPath, drawPaint);
drawPath.reset();
break;
default:
return false;
}
invalidate();
return true;
}
public void setColor(String newColor) {
//set color
invalidate();
paintColor = Color.parseColor(newColor);
drawPaint.setColor(paintColor);
}
public void setBrushSize(float newSize) {
//update sizefloat pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
float pixelAmount = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
newSize, getResources().getDisplayMetrics());
brushSize = pixelAmount;
drawPaint.setStrokeWidth(brushSize);
}
public void setLastBrushSize(float lastSize) {
lastBrushSize = lastSize;
}
public float getLastBrushSize() {
return lastBrushSize;
}
public void setErase(boolean isErase) {
//set erase true or false
erase = isErase;
if (erase) drawPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
else drawPaint.setXfermode(null);
}
public void startNew() {
drawCanvas.drawColor(0, PorterDuff.Mode.CLEAR);
invalidate();
// Bitmap b= BitmapFactory.decodeFile("/storage/emulated/0/Pictures/image.png");
// drawCanvas.drawBitmap(b, 0, 0, null);
//
// invalidate();
}
public void redraw(ArrayList<Bitmap> bits, int i) {
try {
drawCanvas.drawBitmap(bits.get(i), 0, 0, canvasPaint);
invalidate();
}catch (NullPointerException e){
Log.w("DrawingApp","Exception");
}
}
}
protected void onCreate(Bundle savedInstanceState){
if(savedInstanceState != null){
bitmaps=savedInstanceState.getParcelableArrayList("Bits");
j = savedInstanceState.getInt("j");
}
// go ahead with your object initialization. Once your `drawCanvas` is ready and initialized, then call `redraww`.
}
//view given size
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
emptyBitmap = Bitmap.createBitmap(canvasBitmap.getWidth(), canvasBitmap.getHeight(), canvasBitmap.getConfig());
@Override
public void onWindowFocusChanged(boolean hasFocus) {
if (hasFocus) {
if (flag2 == true) {
redraww();
}
}
}