public ColorChip(int color, boolean messageRead, Path shape) { if (shape.equals(STAR)) { mDrawable = new ShapeDrawable(new PathShape(shape, 280f, 280f)); } else { mDrawable = new ShapeDrawable(new PathShape(shape, 320f, 320f)); } if (messageRead) { // Read messages get an outlined circle mDrawable.getPaint().setStyle(Paint.Style.STROKE); } else { // Unread messages get filled, while retaining the outline, so that they stay the same size mDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); } mDrawable.getPaint().setStrokeWidth(20); mDrawable.getPaint().setColor(color); }
public ColorChip(int color, boolean messageRead, Path shape) { if (shape.equals(STAR)) { mDrawable = new ShapeDrawable(new PathShape(shape, 280f, 280f)); } else { mDrawable = new ShapeDrawable(new PathShape(shape, 320f, 320f)); } if (shape.equals(CHECKMARK)) { mDrawable.getPaint().setStrokeWidth(50); } else { mDrawable.getPaint().setStrokeWidth(20); } if (messageRead) { // Read messages get an outlined circle mDrawable.getPaint().setStyle(Paint.Style.STROKE); } else { // Unread messages get filled, while retaining the outline, so that they stay the same size mDrawable.getPaint().setStyle(Paint.Style.FILL_AND_STROKE); } mDrawable.getPaint().setColor(color); }
private void initSquare(Context context) { if (mTriangle == null) { TypedValue typedValue = new TypedValue(); Theme theme = context.getTheme(); // triangle Path chipPath = new Path(); chipPath.moveTo(500f, 0f); chipPath.lineTo(500f, 500f); chipPath.lineTo(0f, 500f); chipPath.close(); mTriangle = new ShapeDrawable(new PathShape(chipPath, 500f, 500f)); mTriangle.setDither(true); int triangleColor = Color.parseColor("#cc1f1f1f"); if (theme.resolveAttribute(R.attr.cp_badgeTriangleColor, typedValue, true)) { triangleColor = typedValue.data; } mTriangle.getPaint().setColor(triangleColor); // line mLinePaint = new Paint(); int lineColor = Color.parseColor("#ffffffff"); if (theme.resolveAttribute(R.attr.cp_badgeLineColor, typedValue, true)) { lineColor = typedValue.data; } mLinePaint.setColor(lineColor); mOffset = 1.5f * mDensity; mLinePaint.setStrokeWidth(mOffset); } initOverlay(context, new RectShape()); }
private void drawDocumentBox(Point[] points, Size stdSize) { Path path = new Path(); HUDCanvasView hud = mMainActivity.getHUD(); // ATTENTION: axis are swapped float previewWidth = (float) stdSize.height; float previewHeight = (float) stdSize.width; path.moveTo( previewWidth - (float) points[0].y, (float) points[0].x ); path.lineTo( previewWidth - (float) points[1].y, (float) points[1].x ); path.lineTo( previewWidth - (float) points[2].y, (float) points[2].x ); path.lineTo( previewWidth - (float) points[3].y, (float) points[3].x ); path.close(); PathShape newBox = new PathShape(path , previewWidth , previewHeight); Paint paint = new Paint(); paint.setColor(Color.argb(64, 0, 255, 0)); Paint border = new Paint(); border.setColor(Color.rgb(0, 255, 0)); border.setStrokeWidth(5); hud.clear(); hud.addShape(newBox, paint, border); mMainActivity.invalidateHUD(); }
/** 通过绘制Path构建一个ShapeDrawable,用来绘制到画布Canvas上 **/ private ShapeDrawable drawGooView() { Path path = new Path(); // 1. 根据当前两圆圆心的距离计算出固定圆的半径 float distance = GeometryUtil.getDistanceBetween2Points(mDragPoint, mStickPoint); tempRadius = getCurrentRadius(distance); // 2. 计算出经过两圆圆心连线的垂线的dragLineK(对边比临边)。求出四个交点坐标 float xDiff = mStickPoint.x - mDragPoint.x; Double dragLineK = null; if (xDiff != 0) { dragLineK = (double) ((mStickPoint.y - mDragPoint.y) / xDiff); } // 分别获得经过两圆圆心连线的垂线与圆的交点(两条垂线平行,所以dragLineK相等)。 PointF[] dragPoints = GeometryUtil.getIntersectionPoints(mDragPoint, dragRadius, dragLineK); PointF[] stickPoints = GeometryUtil.getIntersectionPoints(mStickPoint, tempRadius, dragLineK); // 3. 以两圆连线的0.618处作为 贝塞尔曲线 的控制点。(选一个中间点附近的控制点) PointF newPoint = GeometryUtil.getPointByPercent(mDragPoint, mStickPoint, 0.618f); // 绘制两圆连接 path.moveTo(stickPoints[0].x, stickPoints[0].y); path.quadTo(newPoint.x, newPoint.y, dragPoints[0].x, dragPoints[0].y); path.lineTo(dragPoints[1].x, dragPoints[1].y); path.quadTo(newPoint.x, newPoint.y, stickPoints[1].x, stickPoints[1].y); path.close(); // 将四个交点画到屏幕上 // drawAssistPoint(path, dragPoints, stickPoints); // 构建ShapeDrawable ShapeDrawable shapeDrawable = new ShapeDrawable(new PathShape(path, 50f, 50f)); shapeDrawable.getPaint().setColor(Color.RED); return shapeDrawable; }
/** * 1. Iterating over the path points, saving them in an array ... not bueno. Try to use * {@link android.graphics.PathMeasure} class and get minX and minY from that. * <p> * 2. Scale bitmap down. Currently drawing at density of device. */ public Bitmap createSignatureBitmap() { Paint bitmapSigPaint = new Paint(sigPaint); bitmapSigPaint.setColor(sigPrintColor); RectF sigBounds = new RectF(); sigPath.computeBounds(sigBounds, true); if (sigBounds.width() != 0 && sigBounds.height() != 0) { float density = getResources().getDisplayMetrics().density; int dipWidth = (int) (sigBounds.width() / density); int dipHeight = (int) (sigBounds.height() / density); Bitmap returnedBitmap = Bitmap.createBitmap(dipWidth, dipHeight, Bitmap.Config.ARGB_4444); float minX = Integer.MAX_VALUE; float minY = Integer.MAX_VALUE; for (LinePathPoint point : sigPoints) { minX = Math.min(minX, point.x); minY = Math.min(minY, point.y); } sigPath.offset(-minX, -minY); PathShape pathShape = new PathShape(sigPath, sigBounds.width(), sigBounds.height()); pathShape.resize(dipWidth, dipHeight); Canvas canvas = new Canvas(returnedBitmap); pathShape.draw(canvas, bitmapSigPaint); return returnedBitmap; } return null; }
public void crossLineButtonClick(View view){ Path path = new Path(); path.moveTo(0, 12); path.lineTo(100, 88); ShapeBackgroundSpan shapeSpan = new ShapeBackgroundSpan(0xFF000000, new PathShape(path, 100, 100), true); shapeSpan.setStrokeWidth(6); textView.setSelectionSpan(shapeSpan, new ArrowBackgroundSpan(0xFF7373, 0x22000000)); }
public void crossLineButtonClick(View view){ Path path = new Path(); path.moveTo(0, 12); path.lineTo(100, 88); ShapeBackgroundSpan shapeSpan = new ShapeBackgroundSpan(0xFF000000, new PathShape(path, 100, 100), true); shapeSpan.setStrokeWidth(6); editText.setSelectionSpan(shapeSpan, new ArrowBackgroundSpan(0xFF7373, 0x22000000)); }
private void init() { Log.d("init", String.format("width: %d; height: %d", this.getWidth(), this.getHeight())); Path gridPath = new Path(); int N = 4; float dN = 200f; for(int i = 0; i <= N; i++) { gridPath.moveTo(i * dN, 0); gridPath.lineTo(i * dN, N*dN); gridPath.moveTo(0, i * dN); gridPath.lineTo(N*dN, i * dN); } gridPath.close(); mGridDrawable = new ShapeDrawable(new PathShape(gridPath, this.getWidth(), this.getHeight())); mGridDrawable.getPaint().setColor(0xffeeeeee);//0xff74AC23); mGridDrawable.getPaint().setStyle(Paint.Style.STROKE); mGridDrawable.getPaint().setStrokeWidth(2.0f); mGridDrawable.setBounds(0, 0, this.getWidth(), this.getHeight()); mIntersectPath = new Path(); mIntersectPaint = new Paint(); mIntersectPaint.setColor(0xff74AC23); mIntersectPaint.setStyle(Paint.Style.STROKE); mIntersectPaint.setStrokeWidth(3.0f); mIntersectPath1 = new Path(); mIntersectPaint1 = new Paint(); mIntersectPaint1.setColor(0xffAC2374); mIntersectPaint1.setStyle(Paint.Style.STROKE); mIntersectPaint1.setStrokeWidth(1.0f); }
@Override protected void onSizeChanged(int w, int h, int oldW, int oldH) { mPath.build(mCalloutMarker, w, h, mStroke.getPaint().getStrokeWidth(), mCornerRadius); PathShape shape = new PathShape(mPath, w, h); mFill.setShape(shape); mStroke.setShape(shape); }
public OutlineDrawableView(Context context, int radius) { super(context); this.radius = radius; width_dp = radius * 6; // Convert to dp stroke = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, stroke, getResources().getDisplayMetrics()); outline1 = new ShapeDrawable(new RectShape()); Paint paint1 = outline1.getPaint(); paint1.setColor(0x55000000); paint1.setStrokeWidth(stroke); paint1.setAntiAlias(true); paint1.setStyle(Paint.Style.STROKE); outline2 = new ShapeDrawable(new RectShape()); Paint paint2 = outline2.getPaint(); paint2.setColor(0x55ffffff); paint2.setStrokeWidth(stroke); paint2.setAntiAlias(true); paint2.setStyle(Paint.Style.STROKE); Path path = new Path(); path.moveTo(0, 0); path.lineTo(width_dp, width_dp); path.moveTo(0, width_dp); path.lineTo(width_dp, 0); crosshair = new ShapeDrawable(new PathShape(path, width_dp, width_dp)); Paint paint3 = crosshair.getPaint(); paint3.setColor(0xbb000000); paint3.setStrokeWidth(Math.max(stroke/2, 1)); paint3.setAntiAlias(true); paint3.setStyle(Paint.Style.STROKE); }
/** * Draw the graphic on the supplied canvas. Drawing should use the following methods to * convert to view coordinates for the graphics that are drawn: * <ol> * <li>{@link GraphicOverlay.Graphic#scaleX(float)} and {@link GraphicOverlay.Graphic#scaleY(float)} adjust the size of * the supplied value from the preview scale to the view scale.</li> * <li>{@link GraphicOverlay.Graphic#translateX(float)} and {@link GraphicOverlay.Graphic#translateY(float)} adjust the * coordinate from the preview's coordinate system to the view coordinate system.</li> * </ol> * * @param canvas drawing canvas */ @Override public void draw(Canvas canvas) { //TODO fix the coordinates see http://zhengrui.github.io/android-coordinates.html if(scannedDoc != null && scannedDoc.detectedQuad != null){ //boolean isPortrait = Util.isPortraitMode(mOverlay.getContext()); Path path = new Path(); /* Log.d("DOC-GRAPHIC", "IsPortrait? " + isPortrait); float tlX = isPortrait? translateY((float) scannedDoc.detectedQuad.points[0].y):translateX((float) scannedDoc.detectedQuad.points[0].x); float tlY = isPortrait? translateX((float) scannedDoc.detectedQuad.points[0].x):translateY((float) scannedDoc.detectedQuad.points[0].y); Log.d("DOC-GRAPHIC", "Top left: x: " + scannedDoc.detectedQuad.points[0].x + ", y: " + scannedDoc.detectedQuad.points[0].y + " -> x: " + tlX + ", y: " + tlY); float blX = isPortrait? translateY((float) scannedDoc.detectedQuad.points[1].y):translateX((float) scannedDoc.detectedQuad.points[1].x); float blY = isPortrait? translateX((float) scannedDoc.detectedQuad.points[1].x):translateY((float) scannedDoc.detectedQuad.points[1].y); Log.d("DOC-GRAPHIC", "Bottom left: x: " + scannedDoc.detectedQuad.points[1].x + ", y: " + scannedDoc.detectedQuad.points[1].y + " -> x: " + blX + ", y: " + blY); float brX = isPortrait? translateY((float) scannedDoc.detectedQuad.points[2].y):translateX((float) scannedDoc.detectedQuad.points[2].x); float brY = isPortrait? translateX((float) scannedDoc.detectedQuad.points[2].x):translateY((float) scannedDoc.detectedQuad.points[2].y); Log.d("DOC-GRAPHIC", "Bottom right: x: " + scannedDoc.detectedQuad.points[2].x + ", y: " + scannedDoc.detectedQuad.points[2].y + " -> x: " + brX + ", y: " + brY); float trX = isPortrait? translateY((float) scannedDoc.detectedQuad.points[3].y):translateX((float) scannedDoc.detectedQuad.points[3].x); float trY = isPortrait? translateX((float) scannedDoc.detectedQuad.points[3].x):translateY((float) scannedDoc.detectedQuad.points[3].y); Log.d("DOC-GRAPHIC", "Top right: x: " + scannedDoc.detectedQuad.points[3].x + ", y: " + scannedDoc.detectedQuad.points[3].y + " -> x: " + trX + ", y: " + trY); */ int frameWidth = scannedDoc.getImage().getMetadata().getHeight(); path.moveTo(((float)(frameWidth - scannedDoc.detectedQuad.points[0].y)), ((float)scannedDoc.detectedQuad.points[0].x)); path.lineTo(((float)(frameWidth - scannedDoc.detectedQuad.points[1].y)), ((float)scannedDoc.detectedQuad.points[1].x)); path.lineTo(((float)(frameWidth - scannedDoc.detectedQuad.points[2].y)), ((float)scannedDoc.detectedQuad.points[2].x)); path.lineTo(((float)(frameWidth - scannedDoc.detectedQuad.points[3].y)), ((float)scannedDoc.detectedQuad.points[3].x)); path.close(); PathShape shape = new PathShape(path, scannedDoc.getImage().getMetadata().getHeight(), scannedDoc.getImage().getMetadata().getWidth()); shape.resize(canvas.getWidth(), canvas.getHeight()); shape.draw(canvas, bodyPaint); shape.draw(canvas, borderPaint); //canvas.drawPath(path, borderPaint); //canvas.drawPath(path, bodyPaint); Log.d("DOC-GRAPHIC", "DONE DRAWING"); } }
public hfb(Context paramContext, AttributeSet paramAttributeSet, int paramInt) { super(paramContext, paramAttributeSet, paramInt); setWillNotDraw(false); Context localContext = getContext(); Resources localResources = localContext.getResources(); this.B = localResources.getDimensionPixelSize(aau.yx); this.A = localResources.getDrawable(aau.yD); this.w = localResources.getDimensionPixelSize(aau.yv); this.g = localResources.getDimensionPixelSize(aau.yw); this.b = localResources.getDimensionPixelSize(aau.yB); this.l = localResources.getDimensionPixelSize(aau.yC); int i1 = this.l; int i2 = this.b; int i3 = localResources.getColor(aau.yn); Point localPoint1 = new Point(0, 0); Point localPoint2 = new Point(0, i2); Point localPoint3 = new Point(i1, i2 / 2); Path localPath = new Path(); localPath.setFillType(Path.FillType.EVEN_ODD); localPath.lineTo(localPoint2.x, localPoint2.y); localPath.lineTo(localPoint3.x, localPoint3.y); localPath.lineTo(localPoint1.x, localPoint1.y); localPath.close(); ShapeDrawable localShapeDrawable = new ShapeDrawable(new PathShape(localPath, i1, i2)); localShapeDrawable.getPaint().setColor(i3); this.a = localShapeDrawable; this.u = localResources.getDimensionPixelSize(aau.ys); this.v = localResources.getDimensionPixelOffset(aau.yr); this.x = localResources.getDimensionPixelSize(aau.yp); this.C = localResources.getDimensionPixelSize(aau.yu); this.c = new Button(localContext, null, 0); TypedArray localTypedArray = localContext.obtainStyledAttributes(new int[] { 16843534 }); this.c.setBackgroundResource(localTypedArray.getResourceId(0, 0)); localTypedArray.recycle(); this.c.setGravity(16); this.c.setMaxLines(1); this.c.setEllipsize(TextUtils.TruncateAt.END); this.c.setVisibility(8); addView(this.c); this.e = new TextView(localContext); this.e.setEllipsize(TextUtils.TruncateAt.END); addView(this.e); this.d = new TextView(localContext); this.d.setMaxLines(1); this.d.setEllipsize(TextUtils.TruncateAt.END); addView(this.d); this.f = new TextView(localContext); this.f.setMaxLines(1); this.f.setEllipsize(TextUtils.TruncateAt.END); this.f.setTextAppearance(localContext, aau.yL); addView(this.f); this.i = new TextView(localContext); this.i.setGravity(16); this.i.setTextAppearance(localContext, aau.yL); this.i.setAllCaps(true); this.i.setText(localResources.getString(efj.Gq)); this.i.setVisibility(8); addView(this.i); }
/** * 通过绘制Path构建一个ShapeDrawable,用来绘制到画布Canvas上 * @return */ private ShapeDrawable drawGooView() { Path path = new Path(); //1. 根据当前两圆圆心的距离计算出固定圆的半径 float distance = (float) GeometryUtil.getDistanceBetween2Points(mDragCenter, mStickCenter); stickCircleTempRadius = getCurrentRadius(distance); //2. 计算出经过两圆圆心连线的垂线的dragLineK(对边比临边)。求出四个交点坐标 float xDiff = mStickCenter.x - mDragCenter.x; Double dragLineK = null; if(xDiff != 0){ dragLineK = (double) ((mStickCenter.y - mDragCenter.y) / xDiff); } //分别获得经过两圆圆心连线的垂线与圆的交点(两条垂线平行,所以dragLineK相等)。 PointF[] dragPoints = GeometryUtil.getIntersectionPoints(mDragCenter, dragCircleRadius, dragLineK); PointF[] stickPoints = GeometryUtil.getIntersectionPoints(mStickCenter, stickCircleTempRadius, dragLineK); //3. 以两圆连线的0.618处作为 贝塞尔曲线 的控制点。(选一个中间点附近的控制点) PointF pointByPercent = GeometryUtil.getPointByPercent(mDragCenter, mStickCenter, 0.618f); // 绘制两圆连接 //此处参见示意图{@link https://github.com/PoplarTang/DragGooView } path.moveTo((float)stickPoints[0].x, (float)stickPoints[0].y); path.quadTo((float)pointByPercent.x, (float)pointByPercent.y, (float)dragPoints[0].x, (float)dragPoints[0].y); path.lineTo((float)dragPoints[1].x, (float)dragPoints[1].y); path.quadTo((float)pointByPercent.x, (float)pointByPercent.y, (float)stickPoints[1].x, (float)stickPoints[1].y); path.close(); //将四个交点画到屏幕上 // path.addCircle((float)dragPoints[0].x, (float)dragPoints[0].y, 5, Direction.CW); // path.addCircle((float)dragPoints[1].x, (float)dragPoints[1].y, 5, Direction.CW); // path.addCircle((float)stickPoints[0].x, (float)stickPoints[0].y, 5, Direction.CW); // path.addCircle((float)stickPoints[1].x, (float)stickPoints[1].y, 5, Direction.CW); //构建ShapeDrawable ShapeDrawable shapeDrawable = new ShapeDrawable(new PathShape(path, 50f, 50f)); shapeDrawable.getPaint().setColor(Color.RED); return shapeDrawable; }
private void fillDrawableMap(Context context, Map<Category.CategoryType, Drawable> result) { // EXPENSE final Path expensePath = new Path(); expensePath.moveTo(0, 50); expensePath.lineTo(15, 100); expensePath.lineTo(400, 100); expensePath.lineTo(400, 0); expensePath.lineTo(15, 0); //path.lineTo(0, 50); expensePath.close(); final ShapeDrawable expenseDrawable = new ShapeDrawable(new PathShape(expensePath, 400, 100)); expenseDrawable.getPaint().setShader(new LinearGradient(0, 0, convertPixelsToDp(context.getResources().getDisplayMetrics().widthPixels, context), 0, Color.argb(50, 255, 0, 0), Color.argb(0, 255, 0, 0), Shader.TileMode.CLAMP)); // RED result.put(Category.CategoryType.EXPENSE, expenseDrawable); // INCOME final Path incomePath = new Path(); incomePath.moveTo(0, 0); incomePath.lineTo(0, 100); incomePath.lineTo(385, 100); incomePath.lineTo(400, 50); incomePath.lineTo(385, 0); //path.lineTo(0, 0); incomePath.close(); final ShapeDrawable incomeDrawable = new ShapeDrawable(new PathShape(incomePath, 400, 100)); incomeDrawable.getPaint().setShader(new LinearGradient(0, 0, convertPixelsToDp(context.getResources().getDisplayMetrics().widthPixels, context), 0, Color.argb(0, 0, 255, 0), Color.argb(50, 0, 255, 0), Shader.TileMode.CLAMP)); // GREEN result.put(Category.CategoryType.INCOME, incomeDrawable); // TRANSFER final Path transferPath = new Path(); transferPath.moveTo(0, 50); transferPath.lineTo(15, 100); transferPath.lineTo(385, 100); transferPath.lineTo(400, 50); transferPath.lineTo(385, 0); transferPath.lineTo(15, 0); //path.lineTo(0, 50); transferPath.close(); final ShapeDrawable transferDrawable = new ShapeDrawable(new PathShape(transferPath, 400, 100)); transferDrawable.getPaint().setShader(new LinearGradient(0, 0, convertPixelsToDp(context.getResources().getDisplayMetrics().widthPixels, context), 0, Color.argb(50, 255, 0, 0), Color.argb(50, 0, 255, 0), Shader.TileMode.CLAMP)); // RED -> GREEN result.put(Category.CategoryType.TRANSFER, transferDrawable); }