public static Bitmap capture( View view, float width, float height, boolean scroll, Bitmap.Config config) { if (!view.isDrawingCacheEnabled()) view.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap((int) width, (int) height, config); bitmap.eraseColor(Color.WHITE); Canvas canvas = new Canvas(bitmap); int left = view.getLeft(); int top = view.getTop(); if (scroll) { left = view.getScrollX(); top = view.getScrollY(); } int status = canvas.save(); canvas.translate(-left, -top); float scale = width / view.getWidth(); canvas.scale(scale, scale, left, top); view.draw(canvas); canvas.restoreToCount(status); Paint alphaPaint = new Paint(); alphaPaint.setColor(Color.TRANSPARENT); canvas.drawRect(0f, 0f, 1f, height, alphaPaint); canvas.drawRect(width - 1f, 0f, width, height, alphaPaint); canvas.drawRect(0f, 0f, width, 1f, alphaPaint); canvas.drawRect(0f, height - 1f, width, height, alphaPaint); canvas.setBitmap(null); return bitmap; }
/* * Enabled aggressive block sorting */ @Override protected boolean drawChild(Canvas canvas, View view, long l) { boolean bl; LayoutParams layoutParams = (LayoutParams)view.getLayoutParams(); int n = canvas.save(2); if (this.mCanSlide && !layoutParams.slideable && this.mSlideableView != null) { canvas.getClipBounds(this.mTmpRect); if (this.isLayoutRtlSupport()) { this.mTmpRect.left = Math.max(this.mTmpRect.left, this.mSlideableView.getRight()); } else { this.mTmpRect.right = Math.min(this.mTmpRect.right, this.mSlideableView.getLeft()); } canvas.clipRect(this.mTmpRect); } if (Build.VERSION.SDK_INT >= 11) { bl = super.drawChild(canvas, view, l); } else if (layoutParams.dimWhenOffset && this.mSlideOffset > 0.0f) { Bitmap bitmap; if (!view.isDrawingCacheEnabled()) { view.setDrawingCacheEnabled(true); } if ((bitmap = view.getDrawingCache()) != null) { canvas.drawBitmap(bitmap, view.getLeft(), view.getTop(), layoutParams.dimPaint); bl = false; } else { Log.e("SlidingPaneLayout", "drawChild: child view " + view + " returned null drawing cache"); bl = super.drawChild(canvas, view, l); } } else { if (view.isDrawingCacheEnabled()) { view.setDrawingCacheEnabled(false); } bl = super.drawChild(canvas, view, l); } canvas.restoreToCount(n); return bl; }
@Override public boolean onLongClick(View view) { if (((BrickAdapter) getAdapter()).getActionMode() != BrickAdapter.ActionModeEnum.NO_ACTION) { return true; } ((BrickAdapter) getAdapter()).isDragging = true; ((BrickAdapter) getAdapter()).setSpinnersEnabled(false); int itemPosition = calculateItemPositionAndTouchPointY(view); boolean drawingCacheEnabled = view.isDrawingCacheEnabled(); view.setDrawingCacheEnabled(true); view.measure( MeasureSpec.makeMeasureSpec(ScreenValues.SCREEN_WIDTH, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec( Utils.getPhysicalPixels(WIDTH_OF_BRICK_PREVIEW_IMAGE, getContext()), MeasureSpec.AT_MOST)); view.layout(0, 0, ScreenValues.SCREEN_WIDTH, view.getMeasuredHeight()); view.setDrawingCacheBackgroundColor(Color.TRANSPARENT); view.buildDrawingCache(true); Bitmap bitmap; if (view.getDrawingCache() == null) { view.setDrawingCacheEnabled(drawingCacheEnabled); bitmap = getBitmapFromView(view, getMeasuredWidth(), view.getHeight()); } else { bitmap = Bitmap.createBitmap(view.getDrawingCache()); } view.setDrawingCacheEnabled(drawingCacheEnabled); startDragging(bitmap, touchPointY); if (!dragNewBrick) { setDragViewAnimation(0); dragNewBrick = false; } dragAndDropListener.drag(itemPosition, itemPosition); dimBackground = true; previousItemPosition = itemPosition; return true; }
/** * 功能简述:创建一张当前的view的bitmap截图 功能详细描述:根据指定的缩放比例,对当前view进行截图,并返回截图bitmap 注意: * * @param view:待画的view * @param scale:缩放比例 * @return:view的截图,若当前view为null或宽高<=0,则返回null。 */ public static final Bitmap createBitmap(View view, float scale) { Bitmap pRet = null; if (null == view) { Log.i(TAG, "create bitmap function param view is null"); return pRet; } int scaleWidth = (int) (view.getWidth() * scale); int scaleHeight = (int) (view.getHeight() * scale); if (scaleWidth <= 0 || scaleHeight <= 0) { Log.i(TAG, "create bitmap function param view is not layout"); return pRet; } boolean bViewDrawingCacheEnable = view.isDrawingCacheEnabled(); if (!bViewDrawingCacheEnable) { view.setDrawingCacheEnabled(true); } try { Bitmap viewBmp = view.getDrawingCache(true); // 如果拿到的缓存为空 if (viewBmp == null) { pRet = Bitmap.createBitmap( scaleWidth, scaleHeight, view.isOpaque() ? Config.RGB_565 : Config.ARGB_8888); Canvas canvas = new Canvas(pRet); canvas.scale(scale, scale); view.draw(canvas); canvas = null; } else { pRet = Bitmap.createScaledBitmap(viewBmp, scaleWidth, scaleHeight, true); } viewBmp = null; } catch (OutOfMemoryError e) { pRet = null; Log.i(TAG, "create bitmap out of memory"); } catch (Exception e) { pRet = null; Log.i(TAG, "create bitmap exception"); } if (!bViewDrawingCacheEnable) { view.setDrawingCacheEnabled(false); } return pRet; }
@Override public void onClick(final View view) { if (!viewSwitchLock.tryLock()) { return; } animatedBricks.clear(); final int itemPosition = calculateItemPositionAndTouchPointY(view); final List<CharSequence> items = new ArrayList<CharSequence>(); if (brickList.get(itemPosition) instanceof ScriptBrick) { int scriptIndex = getScriptIndexFromProject(itemPosition); ProjectManager.getInstance().setCurrentScript(sprite.getScript(scriptIndex)); } if (!(brickList.get(itemPosition) instanceof DeadEndBrick) && !(brickList.get(itemPosition) instanceof ScriptBrick)) { items.add(context.getText(R.string.brick_context_dialog_move_brick)); } if ((brickList.get(itemPosition) instanceof UserBrick)) { items.add(context.getText(R.string.brick_context_dialog_show_source)); } if (brickList.get(itemPosition) instanceof NestingBrick) { items.add(context.getText(R.string.brick_context_dialog_animate_bricks)); } if (!(brickList.get(itemPosition) instanceof ScriptBrick)) { items.add(context.getText(R.string.brick_context_dialog_copy_brick)); items.add(context.getText(R.string.brick_context_dialog_delete_brick)); } else { items.add(context.getText(R.string.brick_context_dialog_delete_script)); } if (brickHasAFormula(brickList.get(itemPosition))) { items.add(context.getText(R.string.brick_context_dialog_formula_edit_brick)); } AlertDialog.Builder builder = new AlertDialog.Builder(context); boolean drawingCacheEnabled = view.isDrawingCacheEnabled(); view.setDrawingCacheEnabled(true); view.setDrawingCacheBackgroundColor(Color.TRANSPARENT); view.buildDrawingCache(true); if (view.getDrawingCache() != null) { Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache()); view.setDrawingCacheEnabled(drawingCacheEnabled); ImageView imageView = dragAndDropListView.getGlowingBorder(bitmap); builder.setCustomTitle(imageView); } builder.setItems( items.toArray(new CharSequence[items.size()]), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { CharSequence clickedItemText = items.get(item); if (clickedItemText.equals(context.getText(R.string.brick_context_dialog_move_brick))) { view.performLongClick(); } else if (clickedItemText.equals( context.getText(R.string.brick_context_dialog_show_source))) { launchAddBrickAndSelectBrickAt(context, itemPosition); } else if (clickedItemText.equals( context.getText(R.string.brick_context_dialog_copy_brick))) { copyBrickListAndProject(itemPosition); } else if (clickedItemText.equals( context.getText(R.string.brick_context_dialog_delete_brick)) || clickedItemText.equals( context.getText(R.string.brick_context_dialog_delete_script))) { showConfirmDeleteDialog(itemPosition); } else if (clickedItemText.equals( context.getText(R.string.brick_context_dialog_animate_bricks))) { int itemPosition = calculateItemPositionAndTouchPointY(view); Brick brick = brickList.get(itemPosition); if (brick instanceof NestingBrick) { List<NestingBrick> list = ((NestingBrick) brick).getAllNestingBrickParts(true); for (NestingBrick tempBrick : list) { animatedBricks.add((Brick) tempBrick); } } notifyDataSetChanged(); } else if (clickedItemText.equals( context.getText(R.string.brick_context_dialog_formula_edit_brick))) { clickedEditFormula(brickList.get(itemPosition), view); } } }); alertDialog = builder.create(); if ((selectMode == ListView.CHOICE_MODE_NONE)) { alertDialog.show(); } }