最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android使用貝塞爾曲線仿QQ聊天消息氣泡拖拽效果

 更新時間:2019年01月27日 11:05:09   作者:小悅月CG  
這篇文章主要為大家詳細介紹了Android使用貝塞爾曲線仿QQ聊天消息氣泡拖拽效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下

本文實例為大家分享了Android仿QQ聊天消息氣泡拖拽效果展示的具體代碼,供大家參考,具體內容如下

先畫圓,都會吧。代碼如下:

public class Bezier extends View {
 private final Paint mGesturePaint = new Paint();
 private final Path mPath = new Path();
 private float mX1 = 100, mY1 = 150;
 private float mX2 = 300, mY2 = 150;
 private boolean mBezier = true;
 private int mRadius = 30;
 
 public Bezier(Context context, AttributeSet attrs) {
 super(context, attrs);
 mGesturePaint.setAntiAlias(true);
 mGesturePaint.setStyle(Paint.Style.FILL_AND_STROKE);
 mGesturePaint.setStrokeWidth(5);
 mGesturePaint.setColor(Color.RED);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 super.onDraw(canvas);
 canvas.drawCircle(mX1, mX2, mRadius, mGesturePaint);
 }
 
}

效果

拖拽的另個一圓就不畫了,效果的實現(xiàn)主要是計算兩個點之間的拖拽區(qū)域,如下圖:

求出區(qū)域之后,使用貝塞爾線畫出效果就可以了,代碼:

public class Bezier extends View {
 private final Paint mGesturePaint = new Paint();
 private final Path mPath = new Path();
 private float mX1 = 100, mY1 = 150;
 private float mX2 = 300, mY2 = 150;
 private boolean mBezier = true;
 private int mRadius = 30;
 
 public Bezier(Context context, AttributeSet attrs) {
 super(context, attrs);
 mGesturePaint.setAntiAlias(true);
 mGesturePaint.setStyle(Paint.Style.FILL_AND_STROKE);
 mGesturePaint.setStrokeWidth(5);
 mGesturePaint.setColor(Color.RED);
 setBezier();
 }
 
 private void setBezier() {
 float offsetX = (float) (mRadius * Math.sin(Math.atan((mY2 - mY1) / (mX2 - mX1))));
 float offsetY = (float) (mRadius * Math.cos(Math.atan((mY2 - mY1) / (mX2 - mX1))));
 float x1 = mX1 - offsetX;
 float y1 = mY1 + offsetY;
 
 float x2 = mX2 - offsetX;
 float y2 = mY2 + offsetY;
 
 float x3 = mX2 + offsetX;
 float y3 = mY2 - offsetY;
 
 float x4 = mX1 + offsetX;
 float y4 = mY1 - offsetY;
 
 mPath.reset();
 mPath.moveTo(x1, y1);
 mPath.quadTo((mX1 + mX2) / 2, (mY1 + mY2) / 2, x2, y2);//錨點直接取偏移量的一半
 mPath.lineTo(x3, y3);
 mPath.quadTo((mX1 + mX2) / 2, (mY1 + mY2) / 2, x4, y4);
 mPath.lineTo(x1, y1);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 super.onDraw(canvas);
 //通過畫布繪制多點形成的圖形
 canvas.drawCircle(mX1, mY1, mRadius, mGesturePaint);
 if (mBezier) {
 canvas.drawPath(mPath, mGesturePaint);
 canvas.drawCircle(mX2, mY2, mRadius, mGesturePaint);
 }
 }
}

效果圖:

拖拽效果只要在onTouchEvent里動態(tài)改變拖動點的坐標重繪就可以實現(xiàn)了,代碼:

public class Bezier extends View {
 private final Paint mGesturePaint = new Paint();
 private final Path mPath = new Path();
 private float mX1 = 100, mY1 = 150;
 private float mX2 = 300, mY2 = 150;
 private boolean mBezier = true;
 private int mRadius = 30;
 
 public Bezier(Context context, AttributeSet attrs) {
 super(context, attrs);
 mGesturePaint.setAntiAlias(true);
 mGesturePaint.setStyle(Paint.Style.FILL_AND_STROKE);
 mGesturePaint.setStrokeWidth(5);
 mGesturePaint.setColor(Color.RED);
 setBezier();
 }
 
 private void setBezier() {
 float offsetX = (float) (mRadius * Math.sin(Math.atan((mY2 - mY1) / (mX2 - mX1))));
 float offsetY = (float) (mRadius * Math.cos(Math.atan((mY2 - mY1) / (mX2 - mX1))));
 float x1 = mX1 - offsetX;
 float y1 = mY1 + offsetY;
 
 float x2 = mX2 - offsetX;
 float y2 = mY2 + offsetY;
 
 float x3 = mX2 + offsetX;
 float y3 = mY2 - offsetY;
 
 float x4 = mX1 + offsetX;
 float y4 = mY1 - offsetY;
 
 mPath.reset();
 mPath.moveTo(x1, y1);
 mPath.quadTo((mX1 + mX2) / 2, (mY1 + mY2) / 2, x2, y2);//錨點直接取偏移量的一半
 mPath.lineTo(x3, y3);
 mPath.quadTo((mX1 + mX2) / 2, (mY1 + mY2) / 2, x4, y4);
 mPath.lineTo(x1, y1);
 }
 
 @Override
 protected void onDraw(Canvas canvas) {
 // TODO Auto-generated method stub
 super.onDraw(canvas);
 //通過畫布繪制多點形成的圖形
 canvas.drawCircle(mX1, mY1, mRadius, mGesturePaint);
 if (mBezier) {
 canvas.drawPath(mPath, mGesturePaint);
 canvas.drawCircle(mX2, mY2, mRadius, mGesturePaint);
 }
 }
 
 @Override
 public boolean onTouchEvent(MotionEvent event) {
 mX2 = event.getX();
 mY2 = event.getY();
 switch (event.getAction()) {
 case MotionEvent.ACTION_DOWN:
 mBezier = true;
 setBezier();
 break;
 case MotionEvent.ACTION_MOVE:
 mBezier = true;
 setBezier();
 break;
 case MotionEvent.ACTION_UP:
 mBezier = false;
 break;
 
 }
 invalidate();
 return true;
 }
 
}

源碼:Android仿QQ聊天消息氣泡拖拽效果

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Android布局加載之LayoutInflater示例詳解

    Android布局加載之LayoutInflater示例詳解

    這篇文章主要介紹了Android布局加載之LayoutInflater的相關資料,文中介紹的非常詳細,對大家具有一定的參考借鑒價值,需要的朋友們下面來一起看看吧。
    2017-03-03
  • android之自定義Toast使用方法

    android之自定義Toast使用方法

    有時我們的程序使用默認的Toast時會和程序的整體風格不搭配,這個時候我們就需要自定義Toast,使其與我們的程序更加融合,使用自定義Toast,首先我們需要添加一個布局文件,該布局文件的結構和Activity使用的布局文件結構一致,在該布局文件中我們需設計我們Toast的布局
    2013-01-01
  • Android使用AlertDialog實現(xiàn)彈出菜單的詳細過程

    Android使用AlertDialog實現(xiàn)彈出菜單的詳細過程

    在Android經常會用到AlertDialog,下面這篇文章主要給大家介紹了關于Android使用AlertDialog實現(xiàn)彈出菜單的詳細過程,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04
  • Android編程之軟鍵盤的隱藏顯示實例詳解

    Android編程之軟鍵盤的隱藏顯示實例詳解

    這篇文章主要介紹了Android編程之軟鍵盤的隱藏顯示,結合實例形式詳細分析了Android編程中軟鍵盤的使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • Android spinner下垃菜單用法實例詳解

    Android spinner下垃菜單用法實例詳解

    這篇文章主要介紹了Android spinner下垃菜單用法,詳細分析了spinner下垃菜單的定義、布局及功能實現(xiàn)相關技巧,需要的朋友可以參考下
    2016-07-07
  • Kotlin掛起函數(shù)的詳細介紹

    Kotlin掛起函數(shù)的詳細介紹

    掛起函數(shù)用狀態(tài)機以掛起點將協(xié)程的運算邏輯拆分成不同的片段,每次執(zhí)行協(xié)程運行不同的邏輯片段,由此可以知道協(xié)程是運行在線程中的,線程的并發(fā)處理方式也可以用在協(xié)程上
    2022-09-09
  • 解決Android Studio 格式化快捷鍵和QQ 鎖鍵盤快捷鍵沖突問題

    解決Android Studio 格式化快捷鍵和QQ 鎖鍵盤快捷鍵沖突問題

    每次打開qq使用android studio格式化的快捷鍵Ctrl + Alt +L時,總是出現(xiàn)qq鎖鍵盤提示,怎么回事呢?下面小編給大家?guī)砹薬ndroid studio格式化的快捷鍵和qq快捷鍵之間的沖突的處理方法,需要的朋友參考下吧
    2017-12-12
  • Android注解基礎介紹快速入門與解讀

    Android注解基礎介紹快速入門與解讀

    首先什么是注解,它的作用是什么,本文講解了Android注解的最基本內容與實例解讀
    2018-09-09
  • 利用Android實現(xiàn)一種點贊動畫效果的全過程

    利用Android實現(xiàn)一種點贊動畫效果的全過程

    最近做項目需要實現(xiàn)點贊動畫,下面這篇文章主要給大家介紹了關于利用Android實現(xiàn)一種點贊動畫效果的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • 三款Android炫酷Loading動畫組件推薦

    三款Android炫酷Loading動畫組件推薦

    這篇文章主要介紹了三款Android炫酷Loading動畫組件推薦,本文介紹了CircleProgress、android-shapeLoadingView、WaitingDots等三款Loading組件,并給出了運行效果圖,需要的朋友可以參考下
    2015-05-05

最新評論

若尔盖县| 康乐县| 赤壁市| 安新县| 舞阳县| 宿州市| 德清县| 陈巴尔虎旗| 如皋市| 江安县| 龙海市| 清远市| 溧阳市| 郸城县| 读书| 西华县| 彝良县| 枞阳县| 定兴县| 靖远县| 荆门市| 斗六市| 汶上县| 察哈| 镇坪县| 巴彦淖尔市| 永仁县| 高邮市| 大姚县| 大化| 赤城县| 承德县| 文化| 桑植县| 十堰市| 团风县| 景宁| 易门县| 红原县| 桐庐县| 合阳县|