Android Canvas繪制帶箭頭的直線

先看下效果圖:

在這里插入圖片描述

下面我們直接看代碼

我自定義了一個View,代碼如下:

package com.davis.drawtrangle;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;import java.util.ArrayList;
import java.util.List;public class DrawView extends View {private List<PointBean> pointLists = new ArrayList<PointBean>();private PointBean pointBean = new PointBean(-1, -1, -1, -1);private static int height = 30;private static int bottom = 10;private Paint paint = new Paint(){{setColor(Color.RED);setAntiAlias(true);setStrokeWidth(4.0f);}};public DrawView(Context context) {super(context);}public DrawView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}public DrawView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public void clear(){if(pointBean != null){pointBean.setStartX(-1);pointBean.setStartY(-1);pointBean.setEndX(-1);pointBean.setEndY(-1);}if(pointLists != null && pointLists.size() > 0){pointLists.clear();}invalidate();}@Overrideprotected void onDraw(Canvas canvas) {//super.onDraw(canvas);if(pointLists != null && pointLists.size() > 0){for(int i=0;i<pointLists.size();i++){PointBean pb = pointLists.get(i);canvas.drawLine(pb.getStartX(), pb.getStartY(), pb.getEndX(), pb.getEndY(), paint);drawTrangle(canvas, paint, pb.getStartX(), pb.getStartY(), pb.getEndX(), pb.getEndY(), height, bottom);}}if(pointBean != null && pointBean.getStartX() != -1&& pointBean.getStartY() != -1 && pointBean.getEndX() != -1&& pointBean.getEndY() != -1){canvas.drawLine(pointBean.getStartX(), pointBean.getStartY(), pointBean.getEndX(), pointBean.getEndY(), paint);drawTrangle(canvas, paint, pointBean.getStartX(), pointBean.getStartY(), pointBean.getEndX(), pointBean.getEndY(), height, bottom);}}/*** 繪制三角* @param canvas* @param fromX* @param fromY* @param toX* @param toY* @param height* @param bottom*/private void drawTrangle(Canvas canvas, Paint paintLine, float fromX, float fromY, float toX, float toY, int height, int bottom){try{float juli = (float) Math.sqrt((toX - fromX) * (toX - fromX)+ (toY - fromY) * (toY - fromY));// 獲取線段距離float juliX = toX - fromX;// 有正負,不要取絕對值float juliY = toY - fromY;// 有正負,不要取絕對值float dianX = toX - (height / juli * juliX);float dianY = toY - (height / juli * juliY);float dian2X = fromX + (height / juli * juliX);float dian2Y = fromY + (height / juli * juliY);//終點的箭頭Path path = new Path();path.moveTo(toX, toY);// 此點為三邊形的起點path.lineTo(dianX + (bottom / juli * juliY), dianY- (bottom / juli * juliX));path.lineTo(dianX - (bottom / juli * juliY), dianY+ (bottom / juli * juliX));path.close(); // 使這些點構成封閉的三邊形canvas.drawPath(path, paintLine);}catch (Exception ex){ex.printStackTrace();}}@Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();switch (action){case MotionEvent.ACTION_DOWN:onActionDown(event);break;case MotionEvent.ACTION_MOVE:onActionMove(event);break;case MotionEvent.ACTION_UP:onActionUp(event);break;}return true;//return super.onTouchEvent(event);}private void onActionDown(MotionEvent event){try {if(pointBean == null){pointBean = new PointBean(-1, -1, -1, -1);}pointBean.setStartX(event.getX());pointBean.setStartY(event.getY());}catch (Exception ex){ex.printStackTrace();}invalidate();}private void onActionMove(MotionEvent event){try{if(pointBean != null){pointBean.setEndX(event.getX());pointBean.setEndY(event.getY());}}catch (Exception ex){ex.printStackTrace();}invalidate();}private void onActionUp(MotionEvent event){try {if(pointBean != null){pointBean.setEndX(event.getX());pointBean.setEndY(event.getY());PointBean pb = new PointBean();pb.setStartX(pointBean.getStartX());pb.setStartY(pointBean.getStartY());pb.setEndX(pointBean.getEndX());pb.setEndY(pointBean.getEndY());pointLists.add(pb);pointBean.setStartX(-1);pointBean.setStartY(-1);pointBean.setEndX(-1);pointBean.setEndY(-1);}}catch (Exception ex){ex.printStackTrace();}invalidate();}}

其中關鍵繪制箭頭的是 drawTrangle() 這個方法。

完整的代碼已上傳到github上:Canvas繪制帶箭頭的直線

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446821.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446821.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446821.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用named_mutex實現讀寫鎖,實現進程之間讀共享寫獨占

代碼 代碼的名稱是read_write_mutex.h這個代碼可用&#xff0c;但是未優化&#xff0c;還存在冗余的代碼如果涉及到進程掛掉了&#xff0c;造成進程堵塞&#xff0c;如何解決&#xff1f;還未涉及 //#ifndef BOOST_THREAD_PTHREAD_SHARED_MUTEX_HPP #define BOOST_THREAD_PTHR…

Android Activity之間傳遞類對象

一、簡介 開發過程中&#xff0c;Activity之間傳遞數據是必不可少的&#xff0c;Android中使用Intent和Bundle作為數據載體&#xff0c;在Activity之間傳遞&#xff0c;對于基礎數據類型&#xff0c;Bundle已經提供了相關的put、set方法&#xff0c;而作為自定義的類型則需要有…

C++3個漢諾塔遞歸問題

3個漢諾塔問題A—>C 移動次數2^n-1 hannoni(int n,char a,char b,char c)把n個盤子借助b,從a移動到cmove(int n,char a,char c)把第n個盤子,從a移動到c #include<iostream> #include<cmath> using namespace std; //漢諾塔問題A--->C //2^n-1次移動次數 …

clion編譯器解決undefined reference to symbol ‘shm_open@@GLIBC_2.2.5‘

修改CMakelists文件 cmake_minimum_required(VERSION 3.17) project(mutex_learn)set(CMAKE_CXX_STANDARD 14)set(BOOST_ROOT "/usr/local/include/boost") #添加頭文件搜索路徑 include_directories(/usr/local/include) #添加庫文件搜索路徑 link_directories(/us…

Android 攔截或屏蔽返回鍵

在Android開發中我們常常會遇到需要攔截或屏蔽返回鍵的需求&#xff0c;對攔截后的返回鍵進行特殊操作。 監聽返回鍵有兩種方式 1、重寫OnBackPressed方法 Overridepublic void onBackPressed() {// 完全由自己控制返回鍵邏輯&#xff0c;系統不再控制&#xff0c;但是有個前…

C++遞歸斐波那契數列

第一種 //斐波那契數列 // 0 1 1 … //從第1個開始 代碼 #include<iostream> #include<cmath> using namespace std; //斐波那契數列 // 0 1 1 ... //從第1個開始 int f(int n) {int m; if(n1)return 0;if(n2)return 1;elsemf(n-1)f(n-2);return m;} int mai…

Android onActivityResult中requestCode與resultCode區別

想要了解requestCode與resultCode的區別&#xff0c;我們需要先了解以下三個方法的用法&#xff1a; startActivityForResult(Intent intent, Int requestCode) setResut(int resultCode, Intent intent) onActivityResult(int requestCode, int resultCode, Intent intent) …

使用named_mutex和named_condition配合實現讀寫鎖

代碼 代碼的名稱是read_write_mutex.h初步優化如果涉及到進程掛掉了&#xff0c;造成進程堵塞&#xff0c;如何解決&#xff1f;還未涉及 #include <boost/interprocess/sync/named_condition.hpp> #include <boost/interprocess/sync/named_mutex.hpp>namespace …

C++的輸入與輸出

輸入與輸出 輸入:從外部輸入設備(鍵盤)向計算機輸入數據 輸出:從計算機向外部輸出設備(顯示屏)輸出數據 C使用流對象實現 使用流對象cin與cout,將標準輸入輸出流庫的頭文件iostream包含到源文件 #include<iostream>//標準輸入輸出庫 using namespace std;//使用標準命…

Android 動態計算ListView的高度

目錄一、簡介二、效果圖三、代碼實現一、簡介 在Android開發的過程中有的時候我們需要手動計算ListView的高度&#xff0c;比如說&#xff0c;ScrollView中嵌套ListView的時候&#xff0c;我們就需要手動精確計算ListView的高度了。 如果ListView的Item高度是固定的話還好計算…

DjangoRestFramework(drf實現五個接口)

安裝&#xff1a;pip install djangorestframework 在使用drf之前&#xff0c;先 使用原生Django實現5個接口 models.py from django.db import modelsclass Book(models.Model):namemodels.CharField(max_length53)pricemodels.IntegerField() views.py from app01 impor…

linux使用共享內存進行進程通信

一、什么是共享內存 共享內存就是允許兩個不相關的進程訪問同一個邏輯內存。共享內存是在兩個正在運行的進程之間共享和傳遞數據的一種非常有效的方式。不同進程之間共享的內存通常為同一段物理內存。使用共享內存進行通信的進程都需要同一段共享內存連接到它們自己的地址空間…

安卓TextView文本框與自定義邊框

常用屬性 自定義邊框 基本使用 <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"android:shape"rectangle矩形/ring圓環/oval橢圓/line直線"當為圓環時android:s…

Android RecyclerView實現九宮格效果

RecyclerView更加優化的復用機制和方便實現UI效果&#xff0c;幾乎替代Listview和GridView的使用。但是分割線的實現&#xff0c;需要自己繼承ItemDecoration來繪制。 完整代碼已上傳至Github&#xff1a;RecyclerView實現九宮格效果 效果圖 item的布局文件 <?xml versi…

如何讀取指針指向的地址空間呢?

方法 使用%p 接收指針返回的地址空間 代碼 #include <stdio.h> #include <stdlib.h>int main() {int a 100;int *a_p &a;printf("%p\n",&a);//輸出&#xff1a;002AF744 輸出的是a變量的地址printf("%p\n",a_p);//輸出&#xff1…

科學究研明表,漢字序順并不一定影閱響讀

有個很有意思的現象&#xff1a; 不信你就來試試 中文打亂小工具 github地址&#xff1a;在線打亂文字順序

安卓EditText

常用屬性 android:textAllCaps"false"去除大寫狀態 inputType 常用 textpassword密碼 number數字 phone撥號鍵盤 設置光標位置 editText.setSelection(2);從1開始 editText.setSelection(1,3);從1開始,1–3中間部分,一個范圍

完善博文 共享內存一寫多讀無鎖實現的代碼邏輯部分

使用共享內存(內存映射)實現發布訂閱模式 多進程實現PubSub發布訂閱模式&#xff0c;從而實現進程間的通信。通信方式可以是TCP/UDP&#xff0c;管道Pipe/消息隊列&#xff0c;共享內存shared memory等等。其中TCP/UDP的方式是可以用作局域網以及跨平臺的通信&#xff0c;Pipe…

想對你說的話,就在這里!

甜(Tu)言(Wei)蜜(Qing)語(Hua)最近在github上看到了一個朋友開發的 土味情話在線生成器 &#xff0c;感覺還不錯&#xff0c;在這里推薦一下。 github地址&#xff1a;在線生成土味情話

linux讀寫文件 簡單版

代碼 //write void write_file(const std::string file_name){FILE *fp nullptr;fp fopen(file_name.c_str(),"w");fprintf(fp,"This is testing for mutex\n");fclose(fp); } //read void read_file(const std::string file_name){std::ifstream fp(fi…