3 голоса
 
577 просмотров
12.02.2020 / 11:26  danfedotov45

Как сделать скругленные окончания линий в Android

Создал на основе SurfaceView - рисовалку.
Код MainActivity:
  1. public class MainActivity extends Activity
  2. {
  3.     @Override
  4.     protected void onCreate(Bundle savedInstanceState)
  5.     {
  6.         super.onCreate(savedInstanceState);
  7.         setContentView(new DrawSurface(this));
  8.     getActionBar().hide();
  9.     }
  10. }
Код DrawSurface:
  1. public class DrawSurface extends SurfaceView implements Runnable,SurfaceHolder.Callback
  2. {
  3.     int FPScount = 0;
  4.     int FPS = 0;
  5.     int count = 0;
  6.  
  7.     @Override
  8.     public void run()
  9.     {
  10.         while(true){
  11.         Canvas ca = getHolder().lockCanvas();
  12.         drraw(ca);
  13.         getHolder().unlockCanvasAndPost(ca);
  14.         try {
  15.             thread.sleep(0);
  16.         }
  17.         catch (InterruptedException e) {}
  18.         count++;
  19.         }
  20.     }
  21.  
  22.     Thread th;
  23.  
  24.     @Override
  25.     public void surfaceCreated(SurfaceHolder p1) {
  26.         thread = new Thread(this);
  27.         thread.start();
  28.         th = new Thread(new Runnable() {
  29.             @Override
  30.             public void run() {
  31.                 while (true){
  32.                     FPScount = count;
  33.                     count = 0;
  34.                     try{
  35.                       th.sleep(1000);
  36.                     } catch (InterruptedException e) {}
  37.                 }
  38.             }
  39.         });
  40.         th.start();
  41.     }
  42.  
  43.     @Override
  44.     public void surfaceChanged(SurfaceHolder p1, int p2, int p3, int p4) {}
  45.  
  46.     @Override
  47.     public void surfaceDestroyed(SurfaceHolder p1) {}
  48.  
  49.     Paint paint,text;
  50.     Thread thread;
  51.     Path path;
  52.  
  53.     public DrawSurface(Context c){
  54.         super(c);
  55.         text = new Paint(Paint.ANTI_ALIAS_FLAG);
  56.         text.setTextSize(100);
  57.         text.setStyle(Paint.Style.FILL);
  58.         paint = new Paint();
  59.         paint.setAntiAlias(true);
  60.         paint.setColor(Color.BLUE);
  61.         paint.setStyle(Paint.Style.STROKE);
  62.         paint.setStrokeWidth(10);
  63.         path = new Path();
  64.         getHolder().addCallback(this);
  65.     }
  66.  
  67.     public void drraw(Canvas canvas) {
  68.         canvas.drawColor(Color.WHITE);
  69.         canvas.drawText("FPS: " + Integer.toString(FPScount),0,100,text);
  70.         canvas.drawPath(path,paint);
  71.     }
  72.  
  73.     @Override
  74.     public boolean onTouchEvent(MotionEvent event)
  75.     {
  76.         float x = event.getX();
  77.         float y = event.getY();
  78.  
  79.         switch(event.getAction()){
  80.             case MotionEvent.ACTION_DOWN:{
  81.                 path.moveTo(x,y);
  82.                 path.lineTo(x,y);
  83.             }
  84.             case MotionEvent.ACTION_MOVE:{
  85.                 path.lineTo(x,y);
  86.                 path.moveTo(x,y);
  87.             }
  88.             case MotionEvent.ACTION_UP:{
  89.                 path.lineTo(x,y);
  90.             }
  91.         }
  92.         return true;
  93.     }
  94. }
Но когда рисую у меня линии потресканные(на рисунке ниже), и окончания у них квадратные а не круглые.
Как можно сделать нормальные красивые линии?
Изм. aNNiMON от 12.02.2020 / 12:20

shot-20200212T121121.png (1.34 кб.)
Ответы
 
3 голоса
 
# 12.02.2020 / 12:18  aNNiMON
По умолчанию strokeCap квадратный, нужно поставить на ROUND:
  1. paint.setStrokeCap(Paint.Cap.ROUND);
И в switch, где ты path.lineTo и path.moveTo делаешь при нажатии или отпускании, добавь break. Иначе выходит что при ACTION_DOWN у тебя ещё и ACTION_MOVE и ACTION_UP срабатывают.
  1. switch (event.getAction()) {
  2.     case MotionEvent.ACTION_DOWN:
  3.         path.moveTo(x,y);
  4.         path.lineTo(x,y);
  5.         break;
  6.     case MotionEvent.ACTION_MOVE: {
  7.         path.lineTo(x,y);
  8.         path.moveTo(x,y);
  9.     } break;
  10.     case MotionEvent.ACTION_UP: {
  11.         path.lineTo(x,y);
  12.         break;
  13.     }
  14. }
Показал три варианта использования. Первый предпочтительнее, когда нет объявлений переменных, а значит и фигурные скобки не нужны. Остальные два уже как пожелаешь. Но break обязателен.

:ps: Случайно потёр твой скрин, когда правил заголовок вопроса. Извини. Если можешь, прикрепи заново.
Изм. aNNiMON от 12.02.2020 / 12:25
13.02.2020 / 16:59  danfedotov45
Спасибо
Всего: 1

Реклама

Мы в соцсетях

tw tg yt gt