亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android利用Canvas標(biāo)點(diǎn)畫線并加入位移動畫(2)

 更新時(shí)間:2022年09月19日 09:38:08   作者:不會安卓  
這篇文章主要為大家詳細(xì)介紹了Android利用Canvas標(biāo)點(diǎn)畫線并加入位移動畫的第二篇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了Android利用Canvas標(biāo)點(diǎn)畫線,并加入位移動畫的具體代碼,供大家參考,具體內(nèi)容如下

1.背景

上次公司需求實(shí)現(xiàn)Canvas面板標(biāo)記點(diǎn),畫折現(xiàn),并利用屬性動畫進(jìn)行沿線移動之后,又有了新問題。

發(fā)現(xiàn)公司提供的坐標(biāo)有正值有負(fù)值,并且值很大,很容易超出屏幕范圍,而且由于我們Canvas坐標(biāo)方向與正常坐標(biāo)系不符合,由此發(fā)現(xiàn)做的圖方向也不對。

2.問題

Canvas坐標(biāo)系位于屏幕左上角,且Y正向坐標(biāo)向下,如何轉(zhuǎn)換?

由于坐標(biāo)有正有負(fù),而Canvas默認(rèn)只顯示正方向,如何解決顯示點(diǎn)問題?

坐標(biāo)數(shù)值很大,采用哪種方法進(jìn)行顯示?

隨之而來的動畫坐標(biāo),移動問題?

3.先看最終實(shí)現(xiàn)效果圖

這次繼續(xù)圖片顯示哈,小人依然能沿線移動!

4. 思路

首先我看到拿到的數(shù)據(jù)坐標(biāo)是這樣的

這是正常坐標(biāo)系坐標(biāo),有±,且數(shù)值大。而Canvas默認(rèn)坐標(biāo)系是這樣的,且屏幕內(nèi)坐標(biāo)很小

知道問題,那么開始解決!!

首先要轉(zhuǎn)換Canvas坐標(biāo)系,并且采用采用縮小坐標(biāo)的方式,容納值很大的坐標(biāo)點(diǎn),并且將做坐標(biāo)原點(diǎn)移動到屏幕中央。

Canvas有縮放方法,且能改變原點(diǎn)位置,改變坐標(biāo)系方向!

final void scale(float sx, float sy, float px, float py)

sx,sy即為放大縮放倍數(shù),±代表方向,px,py則為縮放/放大后,,原點(diǎn)移動的位置。現(xiàn)在倒是可以顯示點(diǎn),畫線了。那么屬性動畫的坐標(biāo)原點(diǎn)系依然在左上角,而它沒有縮放方法,怎么實(shí)現(xiàn)小人沿著軌跡移動呢?

那只能利用坐標(biāo)系進(jìn)行換算了!

/**
?* ? canvas.scale(0.4F,0.4F,850,1500);
?* ? 則動畫坐標(biāo) ?X: x*0.4+850*0.6 ? ?
?* ? ? ? ? ? ? Y: y*0.4+1500*0.6 ??
?* ?----------------new------------------
?* ? canvas.scale(0.5F,0.5F,1000,2200);
?* ? 則動畫坐標(biāo) ?X: x*0.5+850*0.5 ? ?
?* ? ? ? ? ? ? ?Y: y*0.5+1500*0.5 ?
?* ? ? ? ? 即 ? X: (x+850)*0.5
?* ? ? ? ? ? ? ?Y: (y+1100)*0.5
* */

具體實(shí)現(xiàn)代碼

DrawView

class DrawView extends View {
?
? ? private Boolean bool=false;
? ? private String num;
? ? private Path path;
?
? ? public DrawView(Context context) {
? ? ? ? super(context);
? ? }
? ? public void setBool(Boolean isDraw,String number){
? ? ? ? this.bool=isDraw;
? ? ? ? this.num=number;
? ? }
?
? ? public void DrawLines(Canvas canvas){
? ? ? ? Paint mPaint3 = new Paint();
? ? ? ? mPaint3.setAntiAlias(true);
? ? ? ? mPaint3.setColor(Color.GREEN);
? ? ? ? mPaint3.setTextSize(36);
? ? ? ? mPaint3.setStrokeWidth(20);
? ? ? ? float[] points3=new float[]{450,100,480,350,480,350,330,500,330,500,510,650,510,650,780,800,780,800,450,900,450,900,450,1200,450,1200,550,1400,550,1400,600,1500};
? ? ? ? canvas.drawLines(points3,mPaint3);
? ? }
?
? ? @Override
? ? public void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);
? ? // ? canvas.scale(0.4F,0.4F,850,1500);
? ? ? ? canvas.scale(0.5F,0.5F,1000,2200);
? ?
? ? ? ?path = new Path();
? ? ? ? /*
? ? ? ? ?* 方法 說明 drawRect 繪制矩形 drawCircle 繪制圓形 drawOval 繪制橢圓 drawPath 繪制任意多邊形
? ? ? ? ?* drawLine 繪制直線 drawPoin 繪制點(diǎn)
? ? ? ? ?*/
? ? ? ? // 創(chuàng)建畫筆
? ? ? ? Paint mPaint = new Paint();
? ? ? ? mPaint.setStrokeWidth(20);
? ? ? ? mPaint.setColor(Color.BLACK);// 設(shè)置紅色
?
? ? ? ? mPaint.setAntiAlias(true);
? ? ? ? mPaint.setTextSize(36);
?
? ? ? ? //繪制Cap為BUTT的點(diǎn)
? ? ? ? Paint mPaint2 = new Paint();
? ? ? ? mPaint2.setStrokeWidth(40);
? ? ? ? mPaint2.setColor(Color.BLUE);
? ? ? ? mPaint2.setStrokeCap(Paint.Cap.ROUND);
?
? ? ? ? Paint mPaint3 = new Paint();
? ? ? ? mPaint3.setAntiAlias(true);
? ? ? ? mPaint3.setColor(Color.GREEN);
? ? ? ? mPaint3.setTextSize(36);
? ? ? ? mPaint3.setStrokeWidth(20);
?
? ? ? ? Paint mPaintxy = new Paint();
? ? ? ? mPaintxy.setStrokeWidth(20);
? ? ? ? mPaintxy.setColor(Color.WHITE);// 設(shè)置紅色
? ? ? ? mPaintxy.setAntiAlias(true);
? ? ? ? mPaintxy.setTextSize(36);
?
?
? ? ? ? /**
? ? ? ? ?* ?1.拿到接口請求數(shù)據(jù)
? ? ? ? ?* ?2.遍歷數(shù)據(jù)num【i】并將數(shù)據(jù)傳給DrawView
? ? ? ? ?* ?3.利用canvas將數(shù)組進(jìn)行點(diǎn)的繪制
? ? ? ? ?* ?4.利用canvas將數(shù)組進(jìn)行線段繪制(需要改變數(shù)組格式)
? ? ? ? ?* ?5.繪制綠線,遍歷數(shù)據(jù),將數(shù)組position和數(shù)組進(jìn)行對應(yīng) 將傳過來的num進(jìn)行對比繪制 position.equals(num){...}
? ? ? ? ?*/
? ? ? ? float[] nums = {(float) -143.798, (float) -683.477, (float) -199.472, (float) -943.149, (float) -317.205, (float) -1496.94, (float) -500.871, (float) -1801.28, (float) -515.062, (float) -2142.18};
? ? ? ? float[] nums2 = {(float) -584.18, (float) -2741.83, (float) -519.028, (float) -3090.7, (float) -655.9, (float) -3082.98, (float) -721.497, (float) -3395.15, (float) -684.025, (float) -3403.24};
?
? ? ? ? canvas.drawPoint(0, 0, mPaint3);
? ? ? ? canvas.drawPoint(100, 100, mPaint3);
? ? ? ? canvas.drawPoint(100, -100, mPaint3);
? ? ? ? canvas.drawPoint(-100, 100, mPaint3);
? ? ? ? canvas.drawPoint(-100, -100, mPaint3);
? ? ? ? canvas.drawText("A1(100,100)", 100, 100, mPaint3);
? ? ? ? canvas.drawText("A1(100,-100)", 100, -100, mPaint3);
? ? ? ? canvas.drawText("A1(-100,100)", -100, 100, mPaint3);
? ? ? ? canvas.drawText("A1(-100,-100)", -100, -100, mPaint3);
?
?
? ? ? ? canvas.drawPoints(new float[]{20,100,100,350,150,430,200,510,250,560,350,650,550,730,670,890,750,1000}, mPaint2);
? ? ? ? canvas.drawPoints(new float[]{170,100,170,200,170,400,170,510,170,730,170,850}, mPaint2);
? ? ? ? canvas.drawPoints(new float[]{450,100,480,350,330,500,510,650,780,800,450,900,450,1200,550,1400,600,1500}, mPaint2);
? ? ? ? canvas.drawPoints(new float[]{140,1200,230,1250,370,1140,500,1220,570,1310,680,1280,750,1300,850,1260}, mPaint2);
? ? ? ? canvas.drawPoints(nums, mPaint2);
? ? ? ? canvas.drawPoints(nums2, mPaint2);
?
? ? ? ? float[] pointsx=new float[]{-1500,0,1500,0};//至少4個(gè)值,即能夠繪制一條直線
? ? ? ? canvas.drawLines(pointsx,mPaintxy);
? ? ? ? float[] pointsy=new float[]{0,1500,0,-1500};//至少4個(gè)值,即能夠繪制一條直線
? ? ? ? canvas.drawLines(pointsy,mPaintxy);
?
?
? ? ? ? float[] points=new float[]{20,100,100,350,100,350,150,430,150,430,200,510,200,510,250,560,250,560,350,650,350,650,550,730,550,730,670,890,670,890,750,1000};//至少4個(gè)值,即能夠繪制一條直線
? ? ? ? canvas.drawLines(points,mPaint);
? ? ? // ?float[] points2=new float[]{170,100,170,200,170,200,170,400,170,400,170,510,170,510,170,730,170,730,170,850};//至少4個(gè)值,即能夠繪制一條直線
? ? ? // ?canvas.drawLines(points2,mPaint);
? ? ? ? //縮小1/2
? ? ? ? float[] points2=new float[]{85,50,85,100,85,100,85,200,85,200,85,255,85,255,85,365,85,365,85,425};//至少4個(gè)值,即能夠繪制一條直線
? ? ? ? canvas.drawLines(points2,mPaint);
?
? ? ? ? float[] points3=new float[]{450,100,480,350,480,350,330,500,330,500,510,650,510,650,780,800,780,800,450,900,450,900,450,1200,450,1200,550,1400,550,1400,600,1500};
? ? ? ? canvas.drawLines(points3,mPaint);
? ? ? ? float[] points4=new float[]{140,1200,230,1250,230,1250,370,1140,370,1140,500,1220,500,1220,570,1310,570,1310,680,1280,680,1280,750,1300,750,1300,850,1260};//至少4個(gè)值,即能夠繪制一條直線
? ? ? ? canvas.drawLines(points4,mPaint);
?
?
? ? ? ? float[] pointsZ=new float[]{(float) -143.798, (float) -683.477, (float) -199.472, (float) -943.149, (float) -199.472, (float) -943.149,(float) -317.205, (float) -1496.94,(float) -317.205, (float) -1496.94, (float) -500.871, (float) -1801.28, (float) -500.871, (float) -1801.28,(float) -515.062, (float) -2142.18};
? ? ? ? canvas.drawLines(pointsZ,mPaint);
? ? ? ? float[] pointsZ2=new float[]{(float) -584.18, (float) -2741.83, (float) -519.028, (float) -3090.7, (float) ?-519.028, (float) -3090.7,(float) -655.9, (float) -3082.98
? ? ? ? ? ? ? ? ,(float) -655.9, (float) -3082.98, (float) -721.497, (float) -3395.15, (float) -721.497, (float) -3395.15,(float) -684.025, (float) -3403.24};
? ? ? ? canvas.drawLines(pointsZ2,mPaint);
?
? ? ? ? if (bool==true){
? ? ? ? ? ? if (num.equals("1")){
? ? ? ? ? ? ? ? DrawLines(canvas);
? ? ? ? ? ? }
? ? ? ? ? ? else if (num.equals("2")){
? ? ? ? ? ? ? ? canvas.drawLines(points2,mPaint3);
? ? ? ? ? ? }
? ? ? ? ? ? else if (num.equals("3")){
? ? ? ? ? ? ? ? canvas.drawLines(points,mPaint3);
? ? ? ? ? ? }
? ? ? ? ? ? else if (num.equals("4")){
? ? ? ? ? ? ? ? canvas.drawLines(points4,mPaint3);
? ? ? ? ? ? }
? ? ? ? ? ? else if (num.equals("5")){
? ? ? ? ? ? ? ? canvas.drawLines(pointsZ,mPaint3);
? ? ? ? ? ? }
? ? ? ? }
? ? }

MainActivity

public class MainActivity extends AppCompatActivity {
?
? ? private EditText mEdiet;
? ? private Button ?mButton;
? ? private ImageView mtv;
? ? ObjectAnimator ?objectAnimatorX,objectAnimatorY;
?
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ??
? ? ? ? initView();
? ? }
?
?
? ? private void initView() {
? ? ? ? RelativeLayout layout=(RelativeLayout) findViewById(R.id.root);
?
? ? ? ? DrawView views=new DrawView(this);
? ? ? ? views.setMinimumHeight(500);
? ? ? ? views.setMinimumWidth(300);
? ? ? ? //通知view組件重繪
? ? ? ? views.invalidate();
? ? ? ? layout.addView(views);
? ? ? ? mEdiet=findViewById(R.id.qd);
? ? ? ? mButton=findViewById(R.id.qd2);
? ? ? ? mtv=findViewById(R.id.dw);
? ? ??
? ? ? ? mButton.setOnClickListener(new View.OnClickListener() {
? ? ? ? ? ? @Override
? ? ? ? ? ? public void onClick(View view) {
? ? ? ? ? ? ? ? String number=mEdiet.getText().toString();
? ? ? ? ? ? ? ? /**
? ? ? ? ? ? ? ? ?* ? canvas.scale(0.4F,0.4F,850,1500);
? ? ? ? ? ? ? ? ?* ? 則動畫坐標(biāo) ?X: x*0.4+850*0.6 ? ?510
? ? ? ? ? ? ? ? ?* ? ? ? ? ? ? Y: y*0.4+1500*0.6 ? 900
? ? ? ? ? ? ? ? ?* ?----------------new------------------
? ? ? ? ? ? ? ? ?* ? canvas.scale(0.5F,0.5F,1000,2200);
? ? ? ? ? ? ? ? ?* ? 則動畫坐標(biāo) ?X: x*0.5+850*0.5 ? ?500
? ? ? ? ? ? ? ? ?* ? ? ? ? ? ? Y: y*0.5+1500*0.5 ?1100
? ? ? ? ? ? ? ? ?* ? ? ? ? 即 ?X: (x+850)*0.5
? ? ? ? ? ? ? ? ?* ? ? ? ? ? ? Y: (y+1100)*0.5
? ? ? ? ? ? ? ? ?* */
? ? ? ? ? ? ? ? if (number.equals("1")){
? ? ? ? ? ? ? ? ? ? ? float [] x= {725,740,665, 755,890,725,725,775,800};
? ? ? ? ? ? ? ? ? ? ? float [] y= {1150,1275,1350,1425,1500,1550,1700,1800,1850};
? ? ? ? ? ? ? ? ? ? ?startPopsAnimTrans(mtv,x,y);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if (number.equals("2")){
? ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? float [] x= {585,585,585, 585,585,585};
? ? ? ? ? ? ? ? ? ? ? float [] y= {1150,1200,1300,1355,1465,1525}; ? ? ? ? ?
? ? ? ? ? ? ? ? ? ? ? startPopsAnimTrans(mtv,x,y);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if (number.equals("5")){
? ? ? ? ? ? ? ? ? ? float [] x= {429,400,342, 250, 243};
? ? ? ? ? ? ? ? ? ? float [] y= {757,629,352,200,29};
? ? ? ? ? ? ? ? ? ? startPopsAnimTrans(mtv,x,y);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? views.setBool(true,number);
? ? ? ? ? ? ? ? views.invalidate();
?
? ? ? ? ? ? }
? ? ? ? });
?
? ? }

? ? private void startPopsAnimTrans(ImageView b,float [] x,float [] y){
? ? ? ? ? ? objectAnimatorX = ObjectAnimator.ofFloat(b,"translationX", x);
? ? ? ? ? ? objectAnimatorX.setDuration(10000);
? ? ? ? ? ? objectAnimatorY = ObjectAnimator.ofFloat(b,"translationY", y);
? ? ? ? ? ? objectAnimatorY.setDuration(10000);
? ? ? ? ? ? objectAnimatorX.start();
? ? ? ? ? ? objectAnimatorY.start();
? ? }
?
?
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android自定義ScrollView使用自定義監(jiān)聽

    Android自定義ScrollView使用自定義監(jiān)聽

    這篇文章主要介紹了Android自定義ScrollView使用自定義監(jiān)聽 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-12-12
  • Android仿淘寶首頁頭條View垂直滾動效果

    Android仿淘寶首頁頭條View垂直滾動效果

    這篇文章主要為大家詳細(xì)介紹了Android仿淘寶首頁頭條View垂直滾動效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Android自定義StickinessView粘性滑動效果

    Android自定義StickinessView粘性滑動效果

    這篇文章主要為大家詳細(xì)介紹了Android自定義StickinessView粘性滑動效果的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • Android學(xué)習(xí)筆記——Menu介紹(一)

    Android學(xué)習(xí)筆記——Menu介紹(一)

    Android3.0(API level 11)開始,Android設(shè)備不再需要專門的菜單鍵。隨著這種變化,Android app應(yīng)該取消對傳統(tǒng)6項(xiàng)菜單的依賴。取而代之的是提供anction bar來提供基本的用戶功能
    2014-10-10
  • Android登錄時(shí)密碼保護(hù)功能

    Android登錄時(shí)密碼保護(hù)功能

    這篇文章主要為大家詳細(xì)介紹了Android登錄時(shí)密碼保護(hù)功能的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • Android開發(fā)中實(shí)現(xiàn)應(yīng)用的前后臺切換效果

    Android開發(fā)中實(shí)現(xiàn)應(yīng)用的前后臺切換效果

    這篇文章主要介紹了Android開發(fā)中實(shí)現(xiàn)應(yīng)用的前后臺切換效果的方法,文章最后還附帶了監(jiān)聽程序是否進(jìn)入后臺的判斷方法,需要的朋友可以參考下
    2016-02-02
  • Android觸摸事件的應(yīng)用詳解

    Android觸摸事件的應(yīng)用詳解

    這篇文章主要為大家詳細(xì)介紹了Android觸摸事件的應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • 如何利用matrix實(shí)現(xiàn)圖片倒影效果

    如何利用matrix實(shí)現(xiàn)圖片倒影效果

    利用matrix可以實(shí)現(xiàn)各種圖片的特效,比如圖片的旋轉(zhuǎn)、縮放、移動,甚至是圖片倒影效果,這篇文章為大家介紹了matrix實(shí)現(xiàn)圖片倒影的代碼,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法

    Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)指定時(shí)間定時(shí)觸發(fā)方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Android FrameWork之SytemServer進(jìn)程fork示例

    Android FrameWork之SytemServer進(jìn)程fork示例

    這篇文章主要為大家介紹了Android FrameWork之SytemServer進(jìn)程fork示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07

最新評論