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

Android自定義view實(shí)現(xiàn)拖動(dòng)小球移動(dòng)

 更新時(shí)間:2020年11月26日 15:54:11   作者:weixin_33670786  
這篇文章主要為大家詳細(xì)介紹了Android自定義view實(shí)現(xiàn)拖動(dòng)小球移動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

Android應(yīng)用界面中可以看得見的都是由一個(gè)個(gè)的View所組成的,幾乎所有的可視的控件都是基于View寫的。在View中提供了對(duì)touch也就是手勢(shì)的捕獲和傳遞,我們可以對(duì)View里面手勢(shì)的重寫來達(dá)到我們所需要的特性。比如說我們現(xiàn)在要做一款游戲,內(nèi)容很簡(jiǎn)單,就是要實(shí)現(xiàn)讓如圖所示的一個(gè)黑色的小球在根據(jù)手指移動(dòng)而在手機(jī)屏幕內(nèi)移動(dòng)。

我們可以重寫View里面的public boolean onTouchEvent(MotionEvent event)方法,來獲取到所有的手勢(shì)操作,再?gòu)闹羞x擇出所需要的手勢(shì)進(jìn)行操作。

所以可以得到如下的一段代碼:

/**
 * Created by obo on 15/8/21.
 */
public class TouchView extends View{
 
  public static String TAG = TouchView.class.getCanonicalName();
  //當(dāng)前小球的位置
  private PointF currrentPosition = new PointF(100,100);
  //手指觸摸起點(diǎn)坐標(biāo)
  private PointF moveStartPosition = new PointF(0,0);
  //當(dāng)前手指位置坐標(biāo)
  private PointF moveEndPosition = new PointF(0,0);
 
  private Context context;
 
  public TouchView(Context context, AttributeSet attrs) {
    super(context, attrs);
    this.context = context;
  }
 
  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);
    canvas.drawCircle(currrentPosition.x + (moveEndPosition.x - moveStartPosition.x),currrentPosition.y+(moveEndPosition.y - moveStartPosition.y),50,new Paint());
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event) {
 
    switch (event.getActionMasked())
    {
      case MotionEvent.ACTION_DOWN:
        moveStartPosition.x = event.getX();
        moveStartPosition.y = event.getY();
        break;
      case MotionEvent.ACTION_MOVE:
        moveEndPosition.x = event.getX();
        moveEndPosition.y = event.getY();
        //刷新
        this.postInvalidate();
        break;
 
      case MotionEvent.ACTION_UP:
        currrentPosition.x += (moveEndPosition.x - moveStartPosition.x);
        currrentPosition.y += (moveEndPosition.y - moveStartPosition.y);
        moveStartPosition.x = moveEndPosition.x;
        moveStartPosition.y = moveEndPosition.y;
        break;
      default:
    }
    return true;
  }
}

可以看到當(dāng)前onTouchEvent方法返回ture,表明這個(gè)View是要對(duì)當(dāng)前手勢(shì)操作進(jìn)行捕獲的,這里包括 按下、移動(dòng)和抬起等相關(guān)操作,如果返回的是false的話,只會(huì)接收到第一次的一個(gè)ACTION_DOWN也就是按下的響應(yīng),之后的移動(dòng)手勢(shì)和抬起的手勢(shì)都無法獲取到。

方法onTouchEvent里面做了三件事情:1.當(dāng)用戶手指按下的時(shí)候,初始化記錄下開始按下的坐標(biāo),并立即返回不需要刷新界面。2.當(dāng)用戶移動(dòng)手指的時(shí)候,記錄用戶手指的位置,并且重新刷新界面。3.當(dāng)用戶退出手勢(shì)也就是抬起手指的時(shí)候,將位移賦值給基礎(chǔ)坐標(biāo)點(diǎn),并讓手勢(shì)起點(diǎn)坐標(biāo)和手勢(shì)終點(diǎn)坐標(biāo)x、y相等(清零)。

而如果使用Matrix的話將會(huì)使整個(gè)過程變得更加簡(jiǎn)單,只需要事先得到小球的bitmap就能使用matrix對(duì)小球進(jìn)行包括 位移、形變、旋轉(zhuǎn)在內(nèi)的變換,這里只使用matrix的位移變換效果,具體實(shí)現(xiàn)代碼如下:

/**
 * Created by obo on 15/8/26.
 */
public class MatrixView extends View {
 
  public final static String TAG = MatrixView.class.getCanonicalName();
  //bitmap運(yùn)行矩陣
  Matrix matrix = new Matrix();
  //記錄點(diǎn)
  PointF startPoint = new PointF();
  //自定義bitmap
  Bitmap bitmap = Bitmap.createBitmap(100,100, Bitmap.Config.ARGB_8888);
 
  public MatrixView(Context context, AttributeSet attrs) {
    super(context, attrs);
 
    Canvas canvas = new Canvas(bitmap);
    //直接在bitmap上面繪制一個(gè)小球
    canvas.drawCircle(50,50,50,new Paint());
  }
 
  @Override
  public void onDraw(Canvas canvas)
  {
    super.onDraw(canvas);
 
    canvas.drawBitmap(bitmap, matrix, new Paint());
  }
 
  @Override
  public boolean onTouchEvent(MotionEvent event)
  {
    super.onTouchEvent(event);
 
    if (event.getActionMasked() == MotionEvent.ACTION_MOVE)
    {
      matrix.postTranslate(event.getX() - startPoint.x, event.getY() - startPoint.y );
      //刷新
      this.postInvalidate();
    }
 
    startPoint.x = event.getX();
    startPoint.y = event.getY();
 
    return true;
 
  }
}

這一塊的代碼實(shí)現(xiàn)的效果和先前的一樣,增加了Matrix變量,少了一個(gè)PointF變量,同時(shí)在onTouchEvent和onDraw方法中的代碼量也降低了一些。Matrix其實(shí)是一個(gè)3X3的矩陣,使用Matrix可以一步步積累變換的操作,無論對(duì)matrix操作多少次,其對(duì)圖片的處理復(fù)雜度都是固定不變的,并且能對(duì)圖片進(jìn)行快速的變換,這就是使用matrix的帶來的好處。

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

相關(guān)文章

  • Android 測(cè)量文字寬度的實(shí)例方法

    Android 測(cè)量文字寬度的實(shí)例方法

    在本篇文章里小編給大家整理了關(guān)于Android 測(cè)量文字寬度的實(shí)例方法,需要的朋友們可以參考學(xué)習(xí)下。
    2020-02-02
  • 詳談Android中onTouch與onClick事件的關(guān)系(必看)

    詳談Android中onTouch與onClick事件的關(guān)系(必看)

    下面小編就為大家?guī)硪黄斦凙ndroid中onTouch與onClick事件的關(guān)系(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Android定時(shí)器和倒計(jì)時(shí)實(shí)現(xiàn)淘寶秒殺功能

    Android定時(shí)器和倒計(jì)時(shí)實(shí)現(xiàn)淘寶秒殺功能

    這篇文章主要為大家詳細(xì)介紹了Android定時(shí)器和倒計(jì)時(shí)實(shí)現(xiàn)淘寶秒殺功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖九宮格控件

    Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖九宮格控件

    這篇文章主要介紹了Android自定義view實(shí)現(xiàn)滑動(dòng)解鎖九宮格控件,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2023-02-02
  • Android中Parcelable的使用詳解

    Android中Parcelable的使用詳解

    Serializable是Java為我們提供的一個(gè)標(biāo)準(zhǔn)化的序列化接口。而Parcelable是Android為我們提供的序列化的接口。 這篇文章主要介紹了Android中Parcelable的使用 ,需要的朋友可以參考下
    2019-06-06
  • Android View滑動(dòng)的實(shí)現(xiàn)分析示例

    Android View滑動(dòng)的實(shí)現(xiàn)分析示例

    View滑動(dòng)是Android實(shí)現(xiàn)自定義控件的基礎(chǔ),同時(shí)在開發(fā)中難免會(huì)遇到View的滑動(dòng)處理,其實(shí)不管是那種滑動(dòng)方法,基本思路是類似的;當(dāng)點(diǎn)擊事件傳到View時(shí),系統(tǒng)記下觸摸點(diǎn)的坐標(biāo),手指移動(dòng)時(shí)系統(tǒng)記下移動(dòng)后的左邊并算出偏移量,通過偏移量來修改View的坐標(biāo)
    2022-08-08
  • Android--SQLite(增,刪,改,查)操作實(shí)例代碼

    Android--SQLite(增,刪,改,查)操作實(shí)例代碼

    Android--SQLite(增,刪,改,查)操作實(shí)例代碼,需要的朋友可以參考一下
    2013-02-02
  • android studio實(shí)現(xiàn)計(jì)算器

    android studio實(shí)現(xiàn)計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了android studio實(shí)現(xiàn)計(jì)算器的具體方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android仿京東快報(bào)信息滾動(dòng)效果

    Android仿京東快報(bào)信息滾動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了Android仿京東快報(bào)信息滾動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局

    Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局

    這篇文章主要介紹了Android應(yīng)用借助LinearLayout實(shí)現(xiàn)垂直水平居中布局的方法,文中列舉了LinearLayout線性布局下居中相關(guān)的幾個(gè)重要參數(shù),需要的朋友可以參考下
    2016-04-04

最新評(píng)論