欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能-創(chuàng)新互聯(lián)

這期內(nèi)容當中小編將會給大家?guī)碛嘘P怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

專注于為中小企業(yè)提供成都網(wǎng)站建設、成都網(wǎng)站設計服務,電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)芒市免費做網(wǎng)站提供優(yōu)質(zhì)的服務。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了千余家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。

功能有以下幾個特點:

  1. 在開始的時候點擊圓以外的區(qū)域不會觸發(fā)拖動事件

  2. 點擊圓的時候可以拖拽,此時會有一個拉伸效果,連接大圓和小圓

  3. 拉伸到一定距離(自己設定)以后兩個圓會斷開,此時即使再拖拽進距離之內(nèi)的時候也不會再產(chǎn)生已經(jīng)斷開的連接

  4. 在距離之內(nèi)松手的時候會回彈會原位置,并伴有一個彈跳動畫

介紹了這么多,看過我前邊文章的朋友應該會有一個基本思路。

暴露接口

這個模擬功能共分為三部分,一個是那個小圓,固定的位置,一個是那個大圓,可以移動,還有一部分就是中間的連接部分,會跟隨大圓一起延伸。

首先看一下都有哪些接口可以調(diào)用:

 public void setMinR(float minR) {
    this.minR = minR;
  }

  public void setMaxR(float maxR) {
    this.maxR = maxR;
  }

  public void setBrokeDistance(float distance) {
    this.brokeDistance = distance;
  }

第一個setMinR是設置小圓的半徑,第二個setMaxR是設置大圓的半徑,第三個setBrokeDistance是設置斷開的距離,也就是小圓和大圓的圓心之間的大連接距離。

初始化

public Buble(Context context) {
    super(context);
    init();
  }

  public Buble(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
  }

簡單的看一下初始化方法。

private void init() {
    paint = new Paint();
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(Color.GREEN);
    paint.setAntiAlias(true);
  }

其實只有一個畫筆,這里可以為各個區(qū)域分別設置畫筆。

繪制圖形

protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    drawOriginalCircle(canvas);
    if (!canBroke) {
      drawMoveCircle(canvas);
      drawBCurve(canvas);
    }
  }

這三個方法相對簡單,drawOriginalCircle是畫中心的小圓,然后canBroke是一個開關,控制是否執(zhí)行畫移動的圓和畫弧線。

 private void drawOriginalCircle(Canvas canvas) {
    canvas.drawCircle(getWidth() / 2, getHeight() / 2, minR, paint);
  }

  private void drawMoveCircle(Canvas canvas) {
    canvas.drawCircle(moveX, moveY, maxR, paint);
  }

  private void drawBCurve(Canvas canvas) {
    canvas.drawPath(path, paint);
  }

注意,moveX, moveY和path都是變化的,所以在他們的值發(fā)生改變以后千萬不要忘記invalidate。

path的連接

關于path的文章網(wǎng)上一大堆。

此處的難點主要是大圓和小圓之間的連接。用一張圖簡單表示一下:

怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能

基本就是這個樣子,path的路徑就是那個黑色的類似于漏斗一樣的東西。此處要計算的角度需要用到三角函數(shù)關系式,簡單表示一下:

怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能

圖中標出的兩個角度是相等的

double angle = Math.atan((offsetX - minCircleX) / (offsetY - minCircleY));

求出這個角度(offsetX是移動圓心的坐標)。

這樣就可以算出四個點的坐標了。

private void setPath(float offsetX, float offsetY) {
    float minCircleX = (float) getWidth() / 2;
    float minCircleY = (float) getHeight() / 2;
    double angle = Math.atan((offsetX - minCircleX) / (offsetY - minCircleY));
    float x1 = (float) (minCircleX + Math.cos(angle) * minR);
    float y1 = (float) (minCircleY - Math.sin(angle) * minR);
    float x2 = (float) (offsetX + Math.cos(angle) * maxR);
    float y2 = (float) (offsetY - Math.sin(angle) * maxR);
    float x3 = (float) (offsetX - Math.cos(angle) * maxR);
    float y3 = (float) (offsetY + Math.sin(angle) * maxR);
    float x4 = (float) (minCircleX - Math.cos(angle) * minR);
    float y4 = (float) (minCircleY + Math.sin(angle) * minR);
    float centerX = minCircleX + (offsetX - minCircleX) / 2;
    float centerY = minCircleY + (offsetY - minCircleY) / 2;
    path.reset();
    path.moveTo(minCircleX, minCircleY);
    path.lineTo(x1, y1);
    path.quadTo(centerX, centerY, x2, y2);
    path.lineTo(x3, y3);
    path.quadTo(centerX, centerY, x4, y4);
    path.lineTo(minCircleX, minCircleY);
    path.close();
  }

注意quadTo的四個參數(shù)的意義,前兩個是你的錨點的坐標,后兩個是你要移動到那個點的位置的坐標。

觸摸事件

這個直接上代碼來實現(xiàn)思路吧,沒什么好講的。

 switch (event.getAction()) {
      case MotionEvent.ACTION_DOWN:
        this.canBroke = false;
        moveX = event.getX();
        moveY = event.getY();
        touchArea = !setCanBroke(moveX, moveY, maxR);
        break;
      case MotionEvent.ACTION_MOVE:
        if (touchArea) {
          moveX = event.getX();
          moveY = event.getY();
          if (setCanBroke(moveX, moveY, brokeDistance)) {
            touchArea = false;
            this.canBroke = true;
          } else {
            setPath(moveX, moveY);
          }
          invalidate();
        }
        break;
      case MotionEvent.ACTION_UP:
        Log.d("aaa", "actionUp" + touchArea);
        if (touchArea) {
          resetCircle(event.getX(), event.getY());
        }
        break;
    }
    return true;

這里主要說明一下這個setCanBroke:

 private boolean setCanBroke(float offsetX, float offsetY, float brokeDistance) {
    float minCircleX = (float) getWidth() / 2;
    float minCircleY = (float) getHeight() / 2;
    return (offsetX - minCircleX) * (offsetX - minCircleX) +
        (offsetY - minCircleY) * (offsetY - minCircleY) > brokeDistance * brokeDistance;
  }

這個表示是否超出了大移動距離,超出則返回真,未超出則返回假。同時在touchArea的設定中它也用用到了,主要是判斷點擊區(qū)域是否在圓圈上。

最后還要講一下這個resetCicle,這個是一個屬性動畫來控制返回原點的彈性動畫:

private void resetCircle(float x, float y) {
    valueAnimatorX = ValueAnimator.ofFloat(x, (float) getWidth() / 2);
    valueAnimatorY = ValueAnimator.ofFloat(y, (float) getHeight() / 2);
    valueAnimatorX.removeAllUpdateListeners();
    valueAnimatorY.removeAllUpdateListeners();
    valueAnimatorX.setInterpolator(new BounceInterpolator());
    valueAnimatorY.setInterpolator(new BounceInterpolator());
    valueAnimatorX.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        tempX = (float) animation.getAnimatedValue();
        moveX = tempX;
      }
    });
    valueAnimatorY.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
      @Override
      public void onAnimationUpdate(ValueAnimator animation) {
        tempY = (float) animation.getAnimatedValue();
        moveY = tempY;
        setPath(tempX, tempY);
        postInvalidate();
      }
    });
    set.playTogether(valueAnimatorX, valueAnimatorY);
    set.start();
  }

上述就是小編為大家分享的怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

當前標題:怎么在android應用中利用view實現(xiàn)一個拖拽刪除功能-創(chuàng)新互聯(lián)
當前地址:http://aaarwkj.com/article28/dipojp.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供面包屑導航、靜態(tài)網(wǎng)站、用戶體驗、云服務器、做網(wǎng)站、App開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網(wǎng)站建設
精品亚洲欧美日韩国产| av天堂久久这里只有精品美国| 一本在线不卡中文字幕| 国产女同一区二区三区久久| 91久久国产免费网站| 日本乱码一区二区三区在线观看| 亚洲欧洲美洲中文天堂| av免费观看男人的天堂| 中文字幕成人资源网站| 国内精品一区二区欧美| 曰韩av毛片在线观看| 亚洲日本香蕉视频观看视频| 小黄片视频免费在线播放| 成人三级中文字幕电影| 快播av手机在线播放| 国产成人av中文字暮在线| 日本亚洲一区二区在线| 亚洲国产黄片在线播放| 亚洲男人成人性天堂网站| 日韩视频专区一区二区| 亚洲国产在线一区二区| 国产一区丝袜高跟在线| 国产亚洲美女在线视频视频| 精品人妻一区二区三区不卡| av免费在线观看大全| 国产精品天干天综合网| 国产亚洲一区二区三区午夜| 九九九热这里只有精品| 神马影院在线观看午夜| av免费在线观看网页| 亚洲国产偷拍在线观看| 亚洲成人久久久久久久| 国产男女免费完整视频| 大片天天看菲色亚洲黄色| 极品白嫩少妇无套内谢| 三级视频一区二区三区| 国产麻豆成人传媒免费观看| 亚洲伦理av在线观看| 亚洲国产成人精品久久精品| 日韩不卡区高清在线视频| 欧美国产成人精品一区|