安卓canvas上如何选中并清除之前画的某一笔画(橡皮功能) 2C
  • 使用drawPath(Path,Paint)方法画的,所有Path存放在一个arraylist之中。
  • 现在想在onTouchEvent方法中实现橡皮功能,手指触摸选中笔画并清除之。
  • 有使用Paint的setStrokeWidth方法,因此画出来的笔画有粗细。

如何判断手指触点坐标是否在形成的笔画图形之内?

最核心问题在于**怎么确定笔画形成的那块区域**?

注:橡皮擦清除整条独立的笔画,类似于Google keep里的绘图那样,不是用背景色绘制触摸轨迹

下面是代码

用于储存path和画笔类型的 fingerPath类:

 import android.graphics.Path;

public class FingerPath {

    public int color;
    public boolean emboss;
    public boolean blur;
    public int strokeWidth;
    public Path path;

    public FingerPath(int color, boolean emboss, boolean blur, int strokeWidth, Path path) {
        this.color = color;
        this.emboss = emboss;
        this.blur = blur;
        this.strokeWidth = strokeWidth;
        this.path = path;
    }
}

自定义view类:


import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BlurMaskFilter;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.EmbossMaskFilter;
import android.graphics.MaskFilter;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.View;

import java.util.ArrayList;


public class PaintView extends View {

    public static int BRUSH_SIZE = 20;
    public static final int DEFAULT_COLOR = Color.RED;
    public static final int DEFAULT_BG_COLOR = Color.WHITE;
    private static final float TOUCH_TOLERANCE = 4;
    private float mX, mY;
    private Path mPath;
    private Paint mPaint;
    private ArrayList<FingerPath> paths = new ArrayList<>();
    private int currentColor;
    private int backgroundColor = DEFAULT_BG_COLOR;
    private int strokeWidth;
    private boolean emboss;
    private boolean blur;
    private MaskFilter mEmboss;
    private MaskFilter mBlur;
    private Bitmap mBitmap;
    private Canvas mCanvas;
    private Paint mBitmapPaint = new Paint(Paint.DITHER_FLAG);

    public PaintView(Context context) {
        this(context, null);
    }

    public PaintView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        mPaint.setColor(DEFAULT_COLOR);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeJoin(Paint.Join.ROUND);
        mPaint.setStrokeCap(Paint.Cap.ROUND);
        mPaint.setXfermode(null);
        mPaint.setAlpha(0xff);

        mEmboss = new EmbossMaskFilter(new float[] {1, 1, 1}, 0.4f, 6, 3.5f);
        mBlur = new BlurMaskFilter(5, BlurMaskFilter.Blur.NORMAL);
    }

    public void init(DisplayMetrics metrics) {
        int height = metrics.heightPixels;
        int width = metrics.widthPixels;

        mBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        mCanvas = new Canvas(mBitmap);

        currentColor = DEFAULT_COLOR;
        strokeWidth = BRUSH_SIZE;
    }

    public void normal() {
        emboss = false;
        blur = false;
    }

    public void emboss() {
        emboss = true;
        blur = false;
    }

    public void blur() {
        emboss = false;
        blur = true;
    }

    public void clear() {
        backgroundColor = DEFAULT_BG_COLOR;
        paths.clear();
        normal();
        invalidate();
    }
    public void undo() {
        int size=paths.size();
        paths.remove(size-1);
        invalidate();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        mCanvas.drawColor(backgroundColor);

        for (FingerPath fp : paths) {
            mPaint.setColor(fp.color);
            mPaint.setStrokeWidth(fp.strokeWidth);
            mPaint.setMaskFilter(null);

            if (fp.emboss)
                mPaint.setMaskFilter(mEmboss);
            else if (fp.blur)
                mPaint.setMaskFilter(mBlur);

            mCanvas.drawPath(fp.path, mPaint);

        }

        canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
        canvas.restore();
    }

    private void touchStart(float x, float y) {
        mPath = new Path();
        FingerPath fp = new FingerPath(currentColor, emboss, blur, strokeWidth, mPath);
        paths.add(fp);

        mPath.reset();
        mPath.moveTo(x, y);
        mX = x;
        mY = y;
        System.out.println("按下时list长度"+paths.size());
    }

    private void touchMove(float x, float y) {
        float dx = Math.abs(x - mX);
        float dy = Math.abs(y - mY);

        if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
            mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
            mX = x;
            mY = y;
        }

    }

    private void touchUp() {
        mPath.lineTo(mX, mY);

    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        float x = event.getX();
        float y = event.getY();

        switch(event.getAction()) {
            case MotionEvent.ACTION_DOWN :
                touchStart(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_MOVE :
                touchMove(x, y);
                invalidate();
                break;
            case MotionEvent.ACTION_UP :
                touchUp();
                invalidate();
                break;
        }

        return true;
    }
}

1个回答

Noob_U_Are
Noob_U_Are 虽然没怎么看懂链接里的内容,但是试了下效果好像就只是拿其他颜色覆盖掉,并不是我想要的方案
接近 3 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
android canvas画布内容的缩放

如何将canvas已经绘制出来的内容进行缩放 在缩放后还能够继续进行绘制 谢谢大佬帮助!

WPF中Canvas画布怎么逐笔清除和清空画布?

WPF中Canvas画布怎么逐笔清除和清空画布? protected override void OnStrokeCollected(InkCanvasStrokeCollectedEventArgs e) { base.Strokes.Remove(e.Stroke); //使用此方法时,请删除之前添加到 InkCanvas 的原始笔划 CustomStroke item = new CustomStroke(e.Stroke.StylusPoints); base.Strokes.Add(item); InkCanvasStrokeCollectedEventArgs args = new InkCanvasStrokeCollectedEventArgs(item); base.OnStrokeCollected(args); } 输出Strokes中为空是为什么,在其他位置调用inkCanvas.Strokes.Clear();没有用。

试图清除 Android SurfaceView/Canvas 时闪烁

我想使用 canvas.drawColor(Color.BLACK) 来清除Canvas,但是如果我只调用一次,显示闪烁,显示旧的图画,这个图画应该被drawColor覆盖。 部分代码: public void update() { //This method is called by a Thread Canvas canvas = holder.lockCanvas(null); if (canvas != null) { onDraw(canvas); } holder.unlockCanvasAndPost(canvas); } @Override protected void onDraw(Canvas canvas) { if (toClear) { canvas.drawColor(Color.BLACK); //if this is not set to change back to false, it does not flicker toClear = false; } //Draw some objects that are moving around } public void clearScreen() { //This method is called when the user pressed a button toClear = true; } 我查找了关于double buffering的资料,了解到lockCanvas() 和 unlockCanvasAndPost() 可以处理这个问题。现在是哪里出错了呢?

Android中使用canvas如何画出以下图形?

请问Android中使用canvas如何画出以下图形?谢谢! ![图片说明](https://img-ask.csdn.net/upload/201904/28/1556467091_306319.png)

Android中用canvas如何绘制动态图?请大神速回,在线等!!

public class MyView extends View { private Paint paint; private int roundColor, roundProgressColor; private float roundWidth; private int style; private int process = 1; private Canvas mcanvas; private RectF oval; public MyView(Context context) { this(context, null); } public MyView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); paint = new Paint(); TypedArray mtypeArray = context.obtainStyledAttributes(attrs, R.styleable.RoundProgressBar); roundColor = mtypeArray.getColor(R.styleable.RoundProgressBar_roundColor, Color.RED); roundWidth = mtypeArray.getDimension(R.styleable.RoundProgressBar_roundWidth, 15); roundProgressColor = mtypeArray.getColor(R.styleable.RoundProgressBar_roundProgressColor, Color.GREEN); style = mtypeArray.getInt(R.styleable.RoundProgressBar_style, 0); mtypeArray.recycle(); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int center = getWidth() / 2; int radius = (int) (center - roundWidth / 2); // // paint.setColor(roundColor); // paint.setStyle(Paint.Style.STROKE); // paint.setStrokeWidth(roundWidth); // paint.setAntiAlias(true); // PathEffect effects = new DashPathEffect(new float[]{10,10,10,10},1); // paint.setPathEffect(effects); // canvas.drawCircle(center, center, radius, paint); paint.setStrokeWidth(roundWidth); paint.setColor(roundProgressColor); oval = new RectF(center - radius, center - radius, center + radius, center + radius); paint.setStyle(Paint.Style.STROKE); PathEffect effects = new DashPathEffect(new float[]{10, 10, 10, 10}, 1); paint.setAntiAlias(true); paint.setPathEffect(effects); canvas.drawArc(oval, 120, 30*process%300, false, paint); mcanvas = canvas; Log.i("pan", "meiyoujinlai"); Log.i("pan", canvas.toString() + "meiyou"); new Thread() { @Override public void run() { super.run(); Message msg = new Message(); msg.what = 1; while (true) { try { mHandler.sendMessage(msg); sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }.start(); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 1) { Log.i("pan", "xianchengzaifa!!"); Log.i("pan", mcanvas + "is value"); mcanvas.drawArc(oval, 120, process % 300, false, paint); process += 20; } } }; } 上面是我的代码,下面是我的效果图![图片说明](https://img-ask.csdn.net/upload/201512/23/1450835340_418578.png)。这是我想实现的动态效果:![图片说明](https://img-ask.csdn.net/upload/201512/23/1450835456_314745.png)

html5 多个canvas 如何用clearRect清除指定的一个canvas上的区域啊?

html5 有两个重叠的canvas 1和2 想用clearRect清除其中一个指定canvas上的矩形区域 怎么操作呢? clearRect(0,0,1000,200);体现不出来是哪个canvas啊 谢谢!!

HTML5的canvas标签为什么会覆盖之前画的东西的颜色

![图片说明](https://img-ask.csdn.net/upload/201712/03/1512305137_554765.png) 请注意这条线是黑色的 我选择颜色画第二条![图片说明](https://img-ask.csdn.net/upload/201712/03/1512305162_311961.png) 为什么左边那条线变成红色了,被我选择的颜色给覆盖了??? 源代码/ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> <style> *{ margin: 0 auto; } canvas{ border:1px solid red; } </style> </head> <body> <div> 背景颜色:<input type="color" onchange="penColorChange()"> 画笔颜色:<input type="color"> 画笔粗细: <select id="selected"> <option>1</option> <option>2</option> <option>3</option> <option>4</option> <option>10</option> </select> </div> <canvas width="1349" height="1000" id="my_canvas"> 你的浏览器不支持canvas标签 </canvas> <p id = "p_1"></p> </body> <script> var b = false; var canvas = document.getElementById("my_canvas"); var draw =canvas.getContext("2d"); document.getElementById("my_canvas").onmousedown = function (e) { draw.moveTo(e.offsetX,e.offsetY); b = true; } document.getElementById("my_canvas").onmousemove = function (e) { if(b){ draw.lineTo(e.offsetX,e.offsetY) draw.stroke(); } document.getElementById("p_1").innerHTML = e.offsetX+" " +e.clientY; } document.getElementById("my_canvas").onmouseup=function () { b = false; } //画笔颜色变换 function penColorChange() { draw.strokeStyle="red"; } </script> </html> ``` ```

android 清理画布canvas后 背景变黑色 可以设置颜色 但不能变得透明了 怎么才能变透明?

我分别用下面两个方法清理画布 1、 canvas.drawColor(colorAlpha, PorterDuff.Mode.CLEAR); 2、 Paint p = new Paint(); // //清屏 // p.setXfermode(new PorterDuffXfermode(Mode.CLEAR)); // canvas.drawPaint(p); // p.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); 背景变成黑色 怎么回到透明

android canvas坐标系的问题

一个问题,在oncreate方法中获取手机屏幕长宽的是像素,而在ondraw方法中用canvas.getWidth();却不是像素,求问这个值是什么,或是怎么样在oncreate获得相同的值。

请问android在webview上用canvas绘制四圆点,拖动后原来的点却无法删除呢?

需求是: 点击一个button,点击一次在webview上绘制两个圆点,点击第二次再绘制两个圆点,监听这四个圆点的触摸移动,将原来绘制的点隐藏会删除,请看代码: button.setonclicklisterner(new View.onclicklistener{ measure_count = ++measure_count; int result = measure_count % 3; LogUtil.i("TAG=" + getClass().getSimpleName(), "result=" + result); switch (result) { case 0: break; case 1: if (DotCanvasView.mCircleInfos != null) { DotCanvasView.mCircleInfos.clear(); } dotCanvasMethod(dotOneX, dotOneY, 0); dotCanvasMethod(dotTwoX, dotTwoY, 1); break; case 2: if (DotCanvasView.mCircleInfos != null) { DotCanvasView.mCircleInfos.clear(); } dotCanvasMethod(dotOneX, dotOneY, 0); dotCanvasMethod(dotTwoX, dotTwoY, 1); dotCanvasMethod(dotThreeX, dotThreeY,2); dotCanvasMethod(dotFourX, dotFourY, 3); break; default: break; } } ``` private void dotCanvasMethod(float dotx, float doty, int tag) { view = new DotCanvasView(this); dotInfo = new DotCanvasView.CircleInfo(); dotInfo.setX(dotx); dotInfo.setY(doty); dotInfo.setTag(tag); DotCanvasView.mCircleInfos.add(dotInfo); view.setMinimumHeight(40); view.setMinimumWidth(40); //通知view组件重绘 view.invalidate(); frame_layout.addView(view); } ``` //圆点绘制类 public class DotCanvasView extends View { public DotCanvasView(Context context) { super(context); } // 保存绘制历史 public static List<CircleInfo> mCircleInfos = new ArrayList<CircleInfo>(); // 保存实心圆相关信息的类 public static class CircleInfo { private float x; // 圆心横坐标 private float y; // 圆心纵坐标 private int tag; //实心圆的标示 public float getX() { return x; } public void setX(float x) { this.x = x; } public float getY() { return y; } public void setY(float y) { this.y = y; } public int getTag() { return tag; } public void setTag(int tag) { this.tag = tag; } } // 当画布重绘时调用该方法,Canvas表示画布对象,可以在该对象上绘制基本的图形 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setAntiAlias(true); // 设置画笔颜色 canvas.save(); paint.setColor(Color.GREEN); // 根据保存的绘制历史重绘所有的实心圆 for (CircleInfo circleInfo : mCircleInfos) { // 绘制实心圆 canvas.drawCircle(circleInfo.getX(), circleInfo.getY(), 20, paint); canvas.save(); } LogUtil.i("TAG=" + getClass().getSimpleName(), "saveCount=" + canvas.getSaveCount()); if (canvas.getSaveCount() >1) { canvas.restoreToCount(1); } } @Override public boolean onTouchEvent(MotionEvent event) { float currentX = event.getX(); float currentY = event.getY(); LogUtil.i("TAG=" + getClass().getSimpleName(), "currentX=" + currentX + "currentY=" + currentY); if (mCircleInfos != null) { for (CircleInfo circledot : mCircleInfos) { if (currentX < (circledot.getX() + 20) && currentX > (circledot.getX() - 20) && currentY < (circledot.getY() + 20) && currentY > (circledot.getY() - 20)) { LogUtil.i("TAG=" + getClass().getSimpleName(), "111dot=" + circledot.getTag() + " dotX=" + circledot.getX() + " doty=" + circledot.getY()); CircleInfo circleInfo = new CircleInfo(); circleInfo.setTag(circledot.getTag()); LogUtil.i("TAG=" + getClass().getSimpleName(), "222tag=" + circledot.getTag()); circleInfo.setX(currentX); circleInfo.setY(currentY); mCircleInfos.set(circledot.getTag(), circleInfo); mCircleInfos.remove(circledot); invalidate(); } LogUtil.i("TAG=" + getClass().getSimpleName(), "333dot=" + circledot.getTag() + " x=" + circledot.getX() + " y=" + circledot.getY()); } } return true; } } xml布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="match_parent"/> <FrameLayout android:id="@+id/frame_layout" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:id="@+id/regional_webView" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_gravity="center_horizontal" android:scrollbars="none" /> </FrameLayout> </LinearLayout>

Canvas上的画出来的东西怎么存储jpg/png图片?

最近在研究画图的东西,像PicSay这个涂鸦软件,应该是在canvas上进行画的,不知道怎么存储成图片的? 或者有没有类似功能的开源项目,想学习画图有关的东西,谢谢!

android 在 view 里我使用一个 自定义的 canvas 画图 出现问题

在 view 里我使用一个 自定义 canvas 画图。先在 canvas 里画出背景, 再画出几个图片。 背景是一个张图片。当触发 onTouchEvent 后,图片移动 canvas 重画背景画出来会有图片移动的痕迹。 如果背景指定了一个颜色就不会有这样的问题。 怎么解决? canvas = new Canvas(bgbitmap); 绘制背景: canvas.drawColor(selectedColor); 如果用 drawBitmap 绘制背景会有问题 // canvas.drawBitmap(bgbitmap, 0, 0, null); // 绘制 图片 for (int i = fbmpCount - 1; i >= 0; i--) { FreeBitmap fb = findFreeBmpByPriority(i); if (fb != null) this.canvas.drawBitmap(fb.getBmp(), fb.getXpoint(), fb.getYpoint(), null); } this.invalidate(); // onDraw 方法。 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bgbitmap, 0, 0, null); }

Android Canvas clipPath 画图锯齿问题

在Canvas上裁剪一个Path,将Bitmap画上去,出现锯齿问题。 Path path = new Path(); path.addCircle(left, top, radius, Path.Direction.CCW); canvas.save(); canvas.clipPath(path); Rect destRect = new Rect(left, top, right, bottom); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); paint.setAntiAlias(true); canvas.drawBitmap(bitmap, srcRect, destRect, paint); canvas.restore();

Android Canvas Clip问题

我想裁剪出一个圆形区域,但是每次裁剪出的都是矩形。。求解·· 这是代码: protected boolean drawChild(Canvas canvas, View child, long drawTime) { mRevealPath.reset(); mRevealPath.addCircle(mCenterX, mCenterY, mRevealRadius, Path.Direction.CW); final int state = canvas.save(); canvas.clipPath(mRevealPath); boolean isInvalidate = super.drawChild(canvas, child, drawTime); canvas.restoreToCount(state); return isInvalidate; }

android canvas(bitmap)失败

目前使用canvas在surfaceview上画路径 需要对路径进行缩放处理 所以想把canvas画的图放在bitmap上进行缩放处理 但是 使用canvas(bitmap)后,画出来的点,并没有显示在bitmap上是什么原因呀

Android中surfaceView画直线断断续续

使用surfaceView做了一个画画板的练习,可是画出来的线断断续续,是为什么? 下面是mainactivity package com.wxh.mywall; import android.app.Activity; import android.app.AlertDialog; import android.app.Dialog; import android.content.DialogInterface; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.os.Bundle; import android.view.Menu; import android.view.MotionEvent; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private SurfaceView mSurfaceView = null; private SurfaceHolder mSurfaceHolder = null; private Button cleanButton = null; private Button colorButton = null; private float oldX = 0f; private float oldY = 0f; private boolean canDraw = false; private Paint mPaint = null; //用来记录当前是哪一种颜色 private int whichColor = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSurfaceView = (SurfaceView)this.findViewById(R.id.surfaceview); mSurfaceHolder = mSurfaceView.getHolder(); mPaint = new Paint(); //画笔的颜色 mPaint.setColor(Color.RED); //画笔的粗细 mPaint.setStrokeWidth(2.0f); cleanButton = (Button)this.findViewById(R.id.flushbutton); //按钮监听 cleanButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //锁定整个SurfaceView Canvas mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawColor(Color.BLACK); //绘制完成,提交修改 mSurfaceHolder.unlockCanvasAndPost(mCanvas); //重新锁一次 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); mSurfaceHolder.unlockCanvasAndPost(mCanvas); } }); colorButton = (Button)this.findViewById(R.id.colorbutton); //按钮监听 colorButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Dialog mDialog = new AlertDialog.Builder(MainActivity.this) .setTitle("颜色设置") .setSingleChoiceItems(new String[]{"红色","绿色","蓝色"}, whichColor, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub switch(which) { case 0: { //画笔的颜色 mPaint.setColor(Color.RED); whichColor = 0; break; } case 1: { //画笔的颜色 mPaint.setColor(Color.GREEN); whichColor = 1; break; } case 2: { //画笔的颜色106 mPaint.setColor(Color.BLUE); whichColor = 2; break; } } } }) .setPositiveButton("确定", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // TODO Auto-generated method stub dialog.dismiss(); } }) .create(); mDialog.show(); } }); } @Override public boolean onTouchEvent(MotionEvent event) { //获取x坐标 float x = event.getX(); //获取y坐标(不知道为什么要减去两个偏移值才对得准屏幕) float y = event.getY()-100; //第一次进来先不管 if(canDraw) { //获取触屏事件 switch(event.getAction()) { //如果是拖动事件 case MotionEvent.ACTION_MOVE: { //锁定整个SurfaceView Canvas mCanvas = mSurfaceHolder.lockCanvas(); mCanvas.drawLine(x, y, oldX, oldY, mPaint); mSurfaceHolder.unlockCanvasAndPost(mCanvas); //重新锁一次 mSurfaceHolder.lockCanvas(new Rect(0, 0, 0, 0)); mSurfaceHolder.unlockCanvasAndPost(mCanvas); break; } } } //保存目前的x坐标值 oldX = x; //保存目前的y坐标值 oldY = y; canDraw = true; return true; } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } } ``` ```

Android利用canvas画图然后在图片正中间写字

因为项目需要,需要用代码绘制一张图片,然后在图片的正中间写一个字

Android canvas.drawBitmap()画出来的图片是按dp而不是像素?

写一个连连看的游戏,图片素材是50*50的,手机分辨率1080P,结果用这个方法绘制出来的图片 canvas.drawBitmap(piece.getImage().getImage(),piece.getBeginX(), piece.getBeginY(), null); 是按dp的?因为一排只能放个7、8张。不是说默认操作是按像素的吗?

canvas画布实现拖拽操作

想请问一下,在画布上画出了一个网络图由点和线构成,那么改如何拖动这个画布改变位置呢?能不能在canvas这个标签上绑定事件?

大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了

大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

ArrayList源码分析(入门篇)

ArrayList源码分析 前言: 写这篇博客的主要原因是,在我上一次参加千牵科技Java实习生面试时,有被面试官问到ArrayList为什么查找的速度较快,插入和删除的速度较慢?当时我回答得不好,很大的一部分原因是因为我没有阅读过ArrayList源码,虽然最后收到Offer了,但我拒绝了,打算寒假学得再深入些再广泛些,下学期开学后再去投递其他更好的公司。为了更加深入理解ArrayList,也为

我以为我学懂了数据结构,直到看了这个导图才发现,我错了

数据结构与算法思维导图

String s = new String(" a ") 到底产生几个对象?

老生常谈的一个梗,到2020了还在争论,你们一天天的,哎哎哎,我不是针对你一个,我是说在座的各位都是人才! 上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。 也就是说准确答案是产生了一个或两个对象,如果常量池中原来没有 ”宜春” ,就是两个。...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

和黑客斗争的 6 天!

互联网公司工作,很难避免不和黑客们打交道,我呆过的两家互联网公司,几乎每月每天每分钟都有黑客在公司网站上扫描。有的是寻找 Sql 注入的缺口,有的是寻找线上服务器可能存在的漏洞,大部分都...

讲一个程序员如何副业月赚三万的真实故事

loonggg读完需要3分钟速读仅需 1 分钟大家好,我是你们的校长。我之前讲过,这年头,只要肯动脑,肯行动,程序员凭借自己的技术,赚钱的方式还是有很多种的。仅仅靠在公司出卖自己的劳动时...

上班一个月,后悔当初着急入职的选择了

最近有个老铁,告诉我说,上班一个月,后悔当初着急入职现在公司了。他之前在美图做手机研发,今年美图那边今年也有一波组织优化调整,他是其中一个,在协商离职后,当时捉急找工作上班,因为有房贷供着,不能没有收入来源。所以匆忙选了一家公司,实际上是一个大型外包公司,主要派遣给其他手机厂商做外包项目。**当时承诺待遇还不错,所以就立马入职去上班了。但是后面入职后,发现薪酬待遇这块并不是HR所说那样,那个HR自...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

玩转springboot启动banner定义所得

最近接手了一个springboot项目,不是不熟悉这个框架,启动时打印的信息吸引了我。 这不是我熟悉的常用springboot的打印信息啊,我打开自己的项目: 还真是的,不用默认的感觉也挺高大上的。一时兴起,就去研究了一下源代码,还正是有些收获,稍后我会总结一下。正常情况下做为一个老程序员,是不会对这种小儿科感兴趣的,不就是一个控制台打印嘛。哈哈! 于是出于最初的好奇,研究了项目的源代码。看到

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发(16k)

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

终于懂了TCP和UDP协议区别

终于懂了TCP和UDP协议区别

你打算用Java 8一辈子都不打算升级到Java 14,真香

我们程序员应该抱着尝鲜、猎奇的心态,否则就容易固步自封,技术停滞不前。

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

《经典算法案例》01-08:如何使用质数设计扫雷(Minesweeper)游戏

我们都玩过Windows操作系统中的经典游戏扫雷(Minesweeper),如果把质数当作一颗雷,那么,表格中红色的数字哪些是雷(质数)?您能找出多少个呢?文中用列表的方式罗列了10000以内的自然数、质数(素数),6的倍数等,方便大家观察质数的分布规律及特性,以便对算法求解有指导意义。另外,判断质数是初学算法,理解算法重要性的一个非常好的案例。

立即提问
相关内容推荐