package com.android.mirror.drawpicture; import android.app.Activity; import android.content.Context; import android.content.Intent; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.os.Bundle; import android.text.TextPaint; import android.view.KeyEvent; import android.view.MotionEvent; import android.view.View; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.EditText; import android.widget.ImageButton; import android.widget.ImageView; import android.widget.LinearLayout; import java.io.InputStream; import java.util.UUID; import android.provider.MediaStore; import android.app.AlertDialog; import android.content.DialogInterface; import android.widget.TextView; import android.widget.Toast; import master.flame.danmaku.controller.IDanmakuView; import master.flame.danmaku.danmaku.loader.ILoader; import master.flame.danmaku.danmaku.loader.IllegalDataException; import master.flame.danmaku.danmaku.loader.android.DanmakuLoaderFactory; import master.flame.danmaku.danmaku.model.BaseDanmaku; import master.flame.danmaku.danmaku.model.android.DanmakuGlobalConfig; import master.flame.danmaku.danmaku.model.android.Danmakus; import master.flame.danmaku.danmaku.model.android.SpannedCacheStuffer; import master.flame.danmaku.danmaku.parser.BaseDanmakuParser; import master.flame.danmaku.danmaku.parser.DanmakuFactory; import master.flame.danmaku.danmaku.parser.IDataSource; import master.flame.danmaku.danmaku.parser.android.BiliDanmukuParser; import master.flame.danmaku.controller.DrawHandler.Callback; import master.flame.danmaku.danmaku.model.DanmakuTimer; public class MainActivity extends Activity implements View.OnClickListener{ //DanmakuViews private IDanmakuView mDanmakuView; private BaseDanmakuParser mParser; //Views for drawing pictures private DrawingView mDrawView; private EditText messageEdT; private ImageButton currPaint, drawBtn, newBtn, saveBtn; private ImageView sendImg; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewsById(); startLogin(); } private void findViewsById(){ mDanmakuView = (IDanmakuView) findViewById(R.id.sv_danmaku); DanmakuGlobalConfig.DEFAULT.setDanmakuStyle(DanmakuGlobalConfig.DANMAKU_STYLE_NONE, 3) .setDuplicateMergingEnabled(false) .setMaximumVisibleSizeInScreen(300) .setCacheStuffer(new BackgroundCacheStuffer()); if(mDanmakuView != null) { mParser = createParser(this.getResources().openRawResource(R.raw.comments)); mDanmakuView.setCallback(new Callback() { @Override public void updateTimer(DanmakuTimer timer) { } @Override public void prepared() { mDanmakuView.start(); } }); mDanmakuView.prepare(mParser); mDanmakuView.enableDanmakuDrawingCache(true); mDanmakuView.show(); } //implements the interface to add a danmaku from your friends mDrawView = (DrawingView)findViewById(R.id.drawing_view); mDrawView.setDanmakuMessageListener(new DrawingView.DanmakuMessageListener() { @Override public void onMessageCome(String msg) { addDanmaku(false, msg); } }); LinearLayout paintLayout = (LinearLayout)findViewById(R.id.paint_colors); currPaint = (ImageButton)paintLayout.getChildAt(0); drawBtn = (ImageButton)findViewById(R.id.draw_btn); drawBtn.setOnClickListener(this); newBtn = (ImageButton)findViewById(R.id.new_btn); newBtn.setOnClickListener(this); saveBtn = (ImageButton)findViewById(R.id.save_btn); saveBtn.setOnClickListener(this); sendImg = (ImageView)findViewById(R.id.send); sendImg.setOnClickListener(this); messageEdT = (EditText)findViewById(R.id.message_edt); messageEdT.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { if (actionId == R.id.send || actionId == EditorInfo.IME_NULL) { String message = messageEdT.getText().toString().trim(); if(!"".equals(message)){ mDrawView.sendDanmaku(message); messageEdT.setText(""); } return true; } return false; } }); } //custom danmakuViews private static class BackgroundCacheStuffer extends SpannedCacheStuffer { final Paint paint = new Paint(); @Override public void measure(BaseDanmaku danmaku, TextPaint paint) { danmaku.padding = 10; super.measure(danmaku, paint); } @Override public void drawBackground(BaseDanmaku danmaku, Canvas canvas, float left, float top) { paint.setColor(Color.argb(0, 0, 0, 0)); canvas.drawRect(left + 2, top + 2, left + danmaku.paintWidth - 2, top + danmaku.paintHeight - 2, paint); } @Override public void drawStroke(BaseDanmaku danmaku, String lineText, Canvas canvas, float left, float top, Paint paint) { } } private void addDanmaku(boolean islive, String msg) { BaseDanmaku danmaku = DanmakuFactory.createDanmaku(BaseDanmaku.TYPE_SCROLL_RL); if (danmaku == null || mDanmakuView == null) { return; } danmaku.text = msg; danmaku.padding = 5; danmaku.priority = 1; danmaku.isLive = islive; danmaku.time = mDanmakuView.getCurrentTime() + 1200; danmaku.textColor = Color.RED; danmaku.textSize = 30f * (mParser.getDisplayer().getDensity() - 0.6f); danmaku.textShadowColor = Color.WHITE; mDanmakuView.addDanmaku(danmaku); } private BaseDanmakuParser createParser(InputStream stream) { if (stream == null) { return new BaseDanmakuParser() { @Override protected Danmakus parse() { return new Danmakus(); } }; } ILoader loader = DanmakuLoaderFactory.create(DanmakuLoaderFactory.TAG_BILI); try { loader.load(stream); } catch (IllegalDataException e) { e.printStackTrace(); } BaseDanmakuParser parser = new BiliDanmukuParser(); IDataSource<?> dataSource = loader.getDataSource(); parser.load(dataSource); return parser; } //first to create a nice name private void startLogin(){ startActivityForResult(new Intent(this, LoginActivity.class), 0); } @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode != Activity.RESULT_OK){ return; } String username = data.getStringExtra("username"); mDrawView.setUserName(username); } //when you change the color, you should let your friends know public void chooseColor(View view){ if(view!=currPaint){ currPaint=(ImageButton)view; String color = view.getTag().toString(); mDrawView.setColor(color); mDrawView.sendChangedColor(color); } } @Override public void onClick(View view) { if(view.getId()==R.id.draw_btn){ AlertDialog.Builder drawDialog = new AlertDialog.Builder(this); drawDialog.setTitle("Have a good time"); drawDialog.setMessage("choose color to paint a picture"); drawDialog.show(); } else if(view.getId()==R.id.new_btn){ AlertDialog.Builder newDialog = new AlertDialog.Builder(this); newDialog.setTitle("New drawing"); newDialog.setMessage("Start new drawing (you will lose the current drawing)?"); newDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which){ mDrawView.startNew(); dialog.dismiss(); } }); newDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which){ dialog.cancel(); } }); newDialog.show(); } else if(view.getId()==R.id.save_btn){ AlertDialog.Builder saveDialog = new AlertDialog.Builder(this); saveDialog.setTitle("Save drawing"); saveDialog.setMessage("Save drawing to device Gallery?"); saveDialog.setPositiveButton("Yes", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which){ mDrawView.setDrawingCacheEnabled(true); String imgSaved = MediaStore.Images.Media.insertImage( getContentResolver(), mDrawView.getDrawingCache(), UUID.randomUUID().toString()+".png", "drawing"); if(imgSaved!=null){ Toast savedToast = Toast.makeText(getApplicationContext(), "Drawing saved to Gallery!", Toast.LENGTH_SHORT); savedToast.show(); } else{ Toast unsavedToast = Toast.makeText(getApplicationContext(), "Oops! Image could not be saved.", Toast.LENGTH_SHORT); unsavedToast.show(); } mDrawView.destroyDrawingCache(); } }); saveDialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener(){ public void onClick(DialogInterface dialog, int which){ dialog.cancel(); } }); saveDialog.show(); }else if(view.getId()==R.id.send){ String message = messageEdT.getText().toString().trim(); if(!message.equals("")); mDrawView.sendDanmaku(message); messageEdT.setText(""); } } // when user click a blank place the keyboard should hide @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (ev.getAction() == MotionEvent.ACTION_DOWN) { View v = getCurrentFocus(); if (isShouldHideInput(v, ev)) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); if (imm != null) { imm.hideSoftInputFromWindow(v.getWindowToken(), 0); } } return super.dispatchTouchEvent(ev); } if (getWindow().superDispatchTouchEvent(ev)) { return true; } return onTouchEvent(ev); } public boolean isShouldHideInput(View v, MotionEvent event) { if (v != null && (v instanceof EditText)) { int[] leftTop = { 0, 0 }; v.getLocationInWindow(leftTop); int left = leftTop[0]; int top = leftTop[1]; int bottom = top + v.getHeight(); int right = left + v.getWidth(); if (event.getX() > left && event.getX() < right && event.getY() > top && event.getY() < bottom) { return false; } else { return true; } } return false; } }