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

android模擬實(shí)現(xiàn)航拍遙控

 更新時(shí)間:2022年08月17日 11:57:47   作者:小貝子  
這篇文章主要為大家詳細(xì)介紹了android模擬實(shí)現(xiàn)航拍遙控,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了android模擬實(shí)現(xiàn)航拍遙控的具體代碼,供大家參考,具體內(nèi)容如下

由于最近做一個(gè)航拍項(xiàng)目,手機(jī)端模擬遙控,控制無人機(jī),之前在網(wǎng)上這方面的知識(shí)比較少,所有就貼出來demo供大家參考,廢話少說,先貼圖

左右兩個(gè)點(diǎn),在圈內(nèi)活動(dòng),一個(gè)是控制油門,一個(gè)是控制方向,放手后會(huì)返回中心點(diǎn),這些在游戲場景中經(jīng)??吹?,比如射擊類的游戲,這里自定義view,繼承ImageView,難點(diǎn)就在手指控制這部分,以下是源碼。

package com.remotecontrol;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Point;
import android.graphics.Rect;
import android.os.Build;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.WindowManager;
import android.widget.ImageView;

/**
?* Created by qingyuan on 2016/5/20.
?* 自定義view 模擬遙控器
?*/
public class RemoteControl extends ImageView ?{

? ? public final String TAG="RemoteControl";

? ? public RemoteControl(Context context) {
? ? ? ? super(context);
? ? ? ? InitData( context);
? ? }

? ? public RemoteControl(Context context, AttributeSet attrs) {
? ? ? ? super(context, attrs);
? ? ? ? InitData( context);
? ? }

? ? public RemoteControl(Context context, AttributeSet attrs, int defStyleAttr) {
? ? ? ? super(context, attrs, defStyleAttr);
? ? ? ? InitData( context);
? ? }

? ? @TargetApi(Build.VERSION_CODES.LOLLIPOP)
? ? public RemoteControl(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
? ? ? ? super(context, attrs, defStyleAttr, defStyleRes);
? ? ? ? InitData( context);
? ? }


? ? DisplayMetrics dm = new DisplayMetrics();
? ? WindowManager manager;

? ? //屏幕的寬跟高
? ? int mDisplayWidth;
? ? int mDisplayWidth_2;//屏幕寬的1/2
? ? int mDisplayWidth_4;//屏幕寬的1/4
? ? int mDisplayWidth_43;//屏幕寬的3/4

? ? int mDisplayHeight;
? ? int mDisplayHeight_2;//屏幕高的1/2
? ? int mDisplayHeight_4;//屏幕高的1/4
? ? int mDisplayHeight_43;//屏幕高的3/4

? ? Point leftCenter;//左邊中點(diǎn)的坐標(biāo)
? ? Point rightCenter;//右邊中點(diǎn)的坐標(biāo)


? ? /********************右邊的底圖**************************/
? ? Bitmap btm_bg;
? ? Rect rectSrc_bg;
? ? Rect rectDst_bg;

? ? /********************左邊的底圖**************************/
? ? Bitmap btm_bar;
? ? Rect rectSrc_bar;
? ? Rect rectDst_bar;

? ? /********************左邊的圓點(diǎn)**************************/
? ? Bitmap btm_circle_left;
? ? MyPoint leftPoint;
? ? double leftDistance;//距離中心點(diǎn)的距離
? ? double leftAngle;//atan2的角度值
? ? int leftCircle_2;//圓的一半

? ? /********************右邊的圓點(diǎn)**************************/
? ? Bitmap btm_circle_right;
? ? MyPoint rightPoint;
? ? double rightDistance;//距離中心點(diǎn)的距離
? ? double rightAngle;//atan2的角度值
? ? int rightCircle_2;//圓的一半

? ? int stopRadius;//圓的半徑,左右的半徑是一樣的

? ? Matrix matrix;//矩陣,同過改變矩陣來改變bitmap的位置

? ? final double degToRad = Math.PI/180.0;
? ? final double radToDeg = 180.0/Math.PI;

? ? public void InitData(Context context)
? ? {
? ? ? ? manager = (WindowManager) context
? ? ? ? ? ? ? ? .getSystemService(Context.WINDOW_SERVICE);
? ? ? ? manager.getDefaultDisplay().getMetrics(dm);
? ? ? ? mDisplayWidth = dm.widthPixels;
? ? ? ? mDisplayHeight = dm.heightPixels;

? ? ? ? ?mDisplayWidth_2=mDisplayWidth/2;//屏幕寬的1/2
? ? ? ? ?mDisplayWidth_4=mDisplayWidth/4;//屏幕寬的1/4
? ? ? ? ?mDisplayWidth_43=mDisplayWidth*3/4;//屏幕寬的3/4

? ? ? ? ?mDisplayHeight_2=mDisplayHeight/2;//屏幕高的1/2
? ? ? ? ?mDisplayHeight_4=mDisplayHeight/4;//屏幕高的1/4
? ? ? ? ?mDisplayHeight_43=mDisplayHeight*3/4;//屏幕高的3/4


? ? ? ? btm_bg= BitmapFactory.decodeResource(context.getResources(),R.drawable.control_bg);
? ? ? ? btm_circle_left= BitmapFactory.decodeResource(context.getResources(),R.drawable.records);
? ? ? ? btm_circle_right= BitmapFactory.decodeResource(context.getResources(),R.drawable.help);
? ? ? ? btm_bar= BitmapFactory.decodeResource(context.getResources(),R.drawable.shift_bar_bg);

? ? ? ? matrix = new Matrix();
? ? ? ? float scaleSize= (float) (mDisplayHeight*1.0/btm_bg.getWidth()*0.65f);//縮放為屏幕的0.65
? ? ? ? matrix.postScale(scaleSize,scaleSize);

? ? ? ? btm_bg = Bitmap.createBitmap(btm_bg,0,0,btm_bg.getWidth(),btm_bg.getHeight(),matrix,true);
? ? ? ? btm_bar = Bitmap.createBitmap(btm_bar,0,0,btm_bar.getWidth(),btm_bar.getHeight(),matrix,true);
? ? ? ? btm_circle_left = Bitmap.createBitmap(btm_circle_left,0,0,btm_circle_left.getWidth(),btm_circle_left.getHeight(),matrix,true);
? ? ? ? btm_circle_right = Bitmap.createBitmap(btm_circle_right,0,0,btm_circle_right.getWidth(),btm_circle_right.getHeight(),matrix,true);

? ? ? ? leftCircle_2=btm_circle_left.getWidth()/2;
? ? ? ? rightCircle_2=btm_circle_right.getWidth()/2;

? ? ? ? //左邊中心點(diǎn)的位置設(shè)為
? ? ? ? leftCenter=new Point();
? ? ? ? leftCenter.set(mDisplayWidth_4,mDisplayHeight_2);

? ? ? ? //右邊中心點(diǎn)的位置設(shè)為
? ? ? ? rightCenter=new Point();
? ? ? ? rightCenter.set(mDisplayWidth_43,mDisplayHeight_2);


? ? ? ? /***********************左邊的地圖位置***************************/
? ? ? ? rectSrc_bar=new Rect(0,0,btm_bar.getWidth(),btm_bar.getHeight());
? ? ? ? rectDst_bar=new Rect(
? ? ? ? ? ? ? ? leftCenter.x-btm_bg.getWidth()/2,
? ? ? ? ? ? ? ? leftCenter.y-btm_bg.getHeight()/2,
? ? ? ? ? ? ? ? leftCenter.x+btm_bg.getWidth()/2,
? ? ? ? ? ? ? ? leftCenter.y+btm_bg.getHeight()/2
? ? ? ? );


? ? ? ? /***********************左邊的圓點(diǎn)位置***************************/
? ? ? ? leftPoint=new MyPoint(leftCenter.x, leftCenter.y);


? ? ? ? /***********************右邊的圓底圖位置***************************/
? ? ? ? rectSrc_bg=new Rect(0,0,btm_bg.getWidth(),btm_bg.getHeight());
? ? ? ? rectDst_bg=new Rect(
? ? ? ? ? ? ? ? rightCenter.x-btm_bar.getWidth()/2,
? ? ? ? ? ? ? ? rightCenter.y-btm_bar.getHeight()/2,
? ? ? ? ? ? ? ? rightCenter.x+btm_bar.getWidth()/2,
? ? ? ? ? ? ? ? rightCenter.y+btm_bar.getHeight()/2
? ? ? ? );

? ? ? ? /***********************右邊邊的圓點(diǎn)位置***************************/
? ? ? ? rightPoint=new MyPoint(rightCenter.x,rightCenter.y);

? ? ? ? //半徑為底圖的一半,這里決定了可移動(dòng)圓的大小
? ? ? ? stopRadius=btm_bg.getWidth()/2;

? ? }


? ? @Override
? ? protected void onDraw(Canvas canvas) {
? ? ? ? super.onDraw(canvas);

? ? ? ? canvas.drawBitmap(btm_bg,rectSrc_bg,rectDst_bg,null);

? ? ? ? canvas.drawBitmap(btm_bar,rectSrc_bar,rectDst_bar,null);

? ? ? ? //更新的左中心點(diǎn)的位置
? ? ? ? matrix.reset();
? ? ? ? matrix.postTranslate(leftPoint.x-leftCircle_2,leftPoint.y-leftCircle_2);
? ? ? ? canvas.drawBitmap(btm_circle_left,matrix,null);

? ? ? ?//更新的右中心點(diǎn)的位置
? ? ? ? matrix.reset();
? ? ? ? matrix.postTranslate(rightPoint.x-rightCircle_2,rightPoint.y-rightCircle_2);
? ? ? ? canvas.drawBitmap(btm_circle_right,matrix,null);

? ? }


? ? @TargetApi(Build.VERSION_CODES.ECLAIR)
? ? @Override
? ? public boolean onTouchEvent(MotionEvent event) {
? ? ? ? float x;
? ? ? ? float y;
? ? ? ? double distance;//圓點(diǎn)離中心點(diǎn)的距離
? ? ? ? double angle;//圓點(diǎn)tan2的角度

? ? ? ? float x2;
? ? ? ? float y2;
? ? ? ? double angle2;
? ? ? ? double distance2;

? ? ? ? switch (MotionEvent.ACTION_MASK & event.getAction())
? ? ? ? {
? ? ? ? ? ? case MotionEvent.ACTION_DOWN:

? ? ? ? ? ? ? ? //判斷第一個(gè)手指按下的位置所在的區(qū)域
? ? ? ? ? ? ? ? if(Math.abs(event.getX()-rightPoint.x)<btm_circle_right.getWidth()
? ? ? ? ? ? ? ? ? ? ? ? && Math.abs(event.getY()-rightPoint.y)<btm_circle_right.getHeight())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? rightPoint.setPointerIndex(0);
? ? ? ? ? ? ? ? ? ? rightPoint.setCanMove(true);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else if(Math.abs(event.getX()-leftPoint.x)<btm_circle_left.getWidth()
? ? ? ? ? ? ? ? ? ? ? ? && Math.abs(event.getY()-leftPoint.y)<btm_circle_left.getHeight())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? leftPoint.setPointerIndex(0);
? ? ? ? ? ? ? ? ? ? leftPoint.setCanMove(true);
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_POINTER_UP:

? ? ? ? ? ? ? ? //獲取離開手指的id
? ? ? ? ? ? ? ? int pointerId = (event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>> MotionEvent.ACTION_POINTER_ID_SHIFT;

? ? ? ? ? ? ? ? //根據(jù)手指離開的id判斷是開了的是哪個(gè)移動(dòng)的點(diǎn)
? ? ? ? ? ? ? ? if(rightPoint.isCanMove() && rightPoint.getPointerIndex()==pointerId){
? ? ? ? ? ? ? ? ? ? rightPoint.setCanMove(false);

? ? ? ? ? ? ? ? ? ? //手指離開讓圓點(diǎn)返回中心點(diǎn)
? ? ? ? ? ? ? ? ? ? rightPoint.x=rightCenter.x;
? ? ? ? ? ? ? ? ? ? rightPoint.y=rightCenter.y;

? ? ? ? ? ? ? ? ? ? rightPoint.setPointerIndex(-1);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? if(leftPoint.isCanMove() &&leftPoint.getPointerIndex()==pointerId)
? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? leftPoint.setCanMove(false);
? ? ? ? ? ? ? ? ? ? leftPoint.x=leftCenter.x;
? ? ? ? ? ? ? ? ? ? leftPoint.y=rightCenter.y;
? ? ? ? ? ? ? ? ? ? leftPoint.setPointerIndex(-1);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_UP:
? ? ? ? ? ? ? ? //全部手指離開之后

? ? ? ? ? ? ? ? rightPoint.setCanMove(false);
? ? ? ? ? ? ? ? rightPoint.x=rightCenter.x;
? ? ? ? ? ? ? ? rightPoint.y=rightCenter.y;
? ? ? ? ? ? ? ? rightPoint.setPointerIndex(0);

? ? ? ? ? ? ? ? leftPoint.setCanMove(false);
? ? ? ? ? ? ? ? leftPoint.x=leftCenter.x;
? ? ? ? ? ? ? ? leftPoint.y=leftCenter.y;
? ? ? ? ? ? ? ? leftPoint.setPointerIndex(0);

? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_POINTER_DOWN:

? ? ? ? ? ? ? ? //獲取第二根手指的id
? ? ? ? ? ? ? ? ?pointerId = (event.getAction()&MotionEvent.ACTION_POINTER_ID_MASK)>>> MotionEvent.ACTION_POINTER_ID_SHIFT;

? ? ? ? ? ? ? ? //第二根手指按下
? ? ? ? ? ? ? ? if(!rightPoint.isCanMove() && Math.abs(event.getX(pointerId)-rightPoint.x)<btm_circle_right.getWidth()
? ? ? ? ? ? ? ? ? ? ? ? && Math.abs(event.getY(pointerId)-rightPoint.y)<btm_circle_right.getHeight())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? rightPoint.setPointerIndex(pointerId);
? ? ? ? ? ? ? ? ? ? rightPoint.setCanMove(true);
? ? ? ? ? ? ? ? }else if(!leftPoint.isCanMove() && Math.abs(event.getX(pointerId)-leftPoint.x)<btm_circle_left.getWidth()
? ? ? ? ? ? ? ? ? ? ? ? && Math.abs(event.getY(pointerId)-leftPoint.y)<btm_circle_left.getHeight())
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? leftPoint.setPointerIndex(pointerId);
? ? ? ? ? ? ? ? ? ? leftPoint.setCanMove(true);
? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? break;
? ? ? ? ? ? case MotionEvent.ACTION_MOVE:

? ? ? ? ? ? ? ? //如果是單指移動(dòng)
? ? ? ? ? ? ? ? if(event.getPointerCount()==1) {

? ? ? ? ? ? ? ? ? ? if (rightPoint.isCanMove()) {
? ? ? ? ? ? ? ? ? ? ? ? x=event.getX(0)-rightCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? y=event.getY(0)-rightCenter.y;

? ? ? ? ? ? ? ? ? ? ? ? //計(jì)算角度,atan2的用法自己百度咯
? ? ? ? ? ? ? ? ? ? ? ? angle = (Math.atan2( x, y )*radToDeg)-90;
? ? ? ? ? ? ? ? ? ? ? ? distance = Math.sqrt((x*x)+(y*y));

? ? ? ? ? ? ? ? ? ? ? ? //判斷是不是超出了規(guī)定的半徑長度
? ? ? ? ? ? ? ? ? ? ? ? if( distance >= stopRadius ) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? distance = stopRadius;
? ? ? ? ? ? ? ? ? ? ? ? ? ? double radAngle = angle*degToRad;
? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.x = (int) (distance*Math.cos(radAngle))+rightCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.y = (int) (-distance*Math.sin(radAngle))+rightCenter.y;

? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.x= (int) event.getX(0);
? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.y = (int)event.getY(0);
? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? rightDistance=distance;
? ? ? ? ? ? ? ? ? ? ? ? rightAngle=angle;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? else if(leftPoint.isCanMove())
? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? x=event.getX(0)-leftCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? y=event.getY(0)-leftCenter.y;
? ? ? ? ? ? ? ? ? ? ? ? angle = (Math.atan2( x, y )*radToDeg)-90;
? ? ? ? ? ? ? ? ? ? ? ? distance = Math.sqrt((x*x)+(y*y));

? ? ? ? ? ? ? ? ? ? ? ? if( distance >= stopRadius ) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? distance = stopRadius;

? ? ? ? ? ? ? ? ? ? ? ? ? ? double radAngle = angle*degToRad;
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.x = (int) (distance*Math.cos(radAngle))+leftCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.y = (int) (-distance*Math.sin(radAngle))+leftCenter.y;

? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.x = (int) event.getX(0);
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.y = (int) event.getY(0);
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? { ?//雙指移動(dòng)
? ? ? ? ? ? ? ? ? ? if (rightPoint.isCanMove() && rightPoint.getPointerIndex()!=-1 ?&& rightPoint.getPointerIndex()<event.getPointerCount() ) {

? ? ? ? ? ? ? ? ? ? ? ? ? ? x=event.getX(rightPoint.getPointerIndex())-rightCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? y=event.getY(rightPoint.getPointerIndex())-rightCenter.y;
? ? ? ? ? ? ? ? ? ? ? ? ? ? angle = (Math.atan2( x, y )*radToDeg)-90;
? ? ? ? ? ? ? ? ? ? ? ? ? ? distance = Math.sqrt((x*x)+(y*y));

? ? ? ? ? ? ? ? ? ? ? ? ? ? if( distance >= stopRadius ) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? distance = stopRadius;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? double radAngle = angle*degToRad;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.x = (int) (distance*Math.cos(radAngle))+rightCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.y = (int) (-distance*Math.sin(radAngle))+rightCenter.y;
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.x = (int) event.getX(rightPoint.getPointerIndex());
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? rightPoint.y = (int) event.getY(rightPoint.getPointerIndex());
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? rightDistance=distance;
? ? ? ? ? ? ? ? ? ? ? ? rightAngle=angle;
? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if(leftPoint.isCanMove() && leftPoint.getPointerIndex()!=-1 && leftPoint.getPointerIndex()<event.getPointerCount())
? ? ? ? ? ? ? ? ? ? {

? ? ? ? ? ? ? ? ? ? ? ? x2=event.getX(leftPoint.getPointerIndex())-leftCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? y2=event.getY(leftPoint.getPointerIndex())-leftCenter.y;
? ? ? ? ? ? ? ? ? ? ? ? angle2 = (Math.atan2( x2, y2 )*radToDeg)-90;
? ? ? ? ? ? ? ? ? ? ? ? distance2 = Math.sqrt((x2*x2)+(y2*y2));

? ? ? ? ? ? ? ? ? ? ? ? if( distance2 >= stopRadius ) {
? ? ? ? ? ? ? ? ? ? ? ? ? ? distance2 = stopRadius;
? ? ? ? ? ? ? ? ? ? ? ? ? ? double radAngle = angle2*degToRad;
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.x = (int) (distance2*Math.cos(radAngle))+leftCenter.x;
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.y = (int) (-distance2*Math.sin(radAngle))+leftCenter.y;
? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.x = (int) event.getX(leftPoint.getPointerIndex());
? ? ? ? ? ? ? ? ? ? ? ? ? ? leftPoint.y = (int) event.getY(leftPoint.getPointerIndex());
? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? ? ? leftDistance=distance2;
? ? ? ? ? ? ? ? ? ? ? ? leftAngle=angle2;
? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? break;
? ? ? ? }

? ? ? ? invalidate();
? ? ? ? return true;
? ? }


? ? public double getRightDistance() {
? ? ? ? return rightDistance;
? ? }

? ? public double getRightAngle() {
? ? ? ? return rightAngle;
? ? }

? ? public double getLeftAngle() {
? ? ? ? return leftAngle;
? ? }

? ? public double getLeftDistance() {
? ? ? ? return leftDistance;
? ? }

? ? /**
? ? ?* 自定義坐標(biāo)點(diǎn),添加了兩個(gè)屬性
? ? ?*/
? ? public class MyPoint extends Point{

? ? ? ? //手指的index
? ? ? ? private int pointerIndex=-1;

? ? ? ? //是否能移動(dòng)
? ? ? ? private boolean isCanMove;

? ? ? ? public boolean isCanMove() {
? ? ? ? ? ? return isCanMove;
? ? ? ? }

? ? ? ? public void setCanMove(boolean canMove) {
? ? ? ? ? ? isCanMove = canMove;
? ? ? ? }

? ? ? ? public MyPoint(int x, int y) {
? ? ? ? ? ? super(x, y);
? ? ? ? }

? ? ? ? public int getPointerIndex() {
? ? ? ? ? ? return pointerIndex;
? ? ? ? }

? ? ? ? public void setPointerIndex(int pointerIndex) {
? ? ? ? ? ? this.pointerIndex = pointerIndex;
? ? ? ? }
? ? }

}

在我的真正項(xiàng)目中對內(nèi)存性能要求比較高,所有我并沒有直接用繼承ImageView,而是使用了SurfaceView,雙緩沖,單獨(dú)線程刷新畫面,還有局部刷新,基本上跟上面的差不多,只是將onDraw()里面的刷新代碼放到SurfaceView中,網(wǎng)上也有很多SurfaceView使用的例子,稍微借鑒一下就能轉(zhuǎn)過來。

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

相關(guān)文章

  • Android事件與手勢操作詳解

    Android事件與手勢操作詳解

    現(xiàn)在程序都是通過事件實(shí)現(xiàn)人機(jī)交互的。事件:用于對圖形界面的操作,有物理按鍵事件和觸摸屏事件兩大類。在Android組件中提供了事件處理的相關(guān)方法,如在View類中提供onTouchEvent()方法重寫觸摸屏事件,setOnTouchListener()方法為組件設(shè)置監(jiān)聽器來處理觸摸屏事件
    2022-12-12
  • android開發(fā)教程之listview顯示sqlite數(shù)據(jù)

    android開發(fā)教程之listview顯示sqlite數(shù)據(jù)

    這篇文章主要介紹了android使用listview顯示sqlite數(shù)據(jù)的方法,需要的朋友可以參考下
    2014-03-03
  • ListView實(shí)現(xiàn)下拉動(dòng)態(tài)渲染數(shù)據(jù)

    ListView實(shí)現(xiàn)下拉動(dòng)態(tài)渲染數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了ListView實(shí)現(xiàn)下拉動(dòng)態(tài)渲染數(shù)據(jù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Android編程防止進(jìn)程被第三方軟件殺死的方法

    Android編程防止進(jìn)程被第三方軟件殺死的方法

    這篇文章主要介紹了Android編程防止進(jìn)程被第三方軟件殺死的方法,涉及Android進(jìn)程操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-10-10
  • Android圖片裁剪功能實(shí)現(xiàn)代碼

    Android圖片裁剪功能實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android圖片裁剪功能實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • Android文本輸入框(EditText)輸入密碼時(shí)顯示與隱藏

    Android文本輸入框(EditText)輸入密碼時(shí)顯示與隱藏

    這篇文章主要介紹了Android文本輸入框(EditText)輸入密碼時(shí)顯示與隱藏的方法和示例,需要的朋友可以參考下
    2014-12-12
  • Android開發(fā)基礎(chǔ)簡化Toast調(diào)用方法詳解

    Android開發(fā)基礎(chǔ)簡化Toast調(diào)用方法詳解

    這篇文章主要為大家介紹了Android開發(fā)基礎(chǔ)簡化Toast調(diào)用方法的相關(guān)資料,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • Android布局技巧之創(chuàng)建可重用的UI組件

    Android布局技巧之創(chuàng)建可重用的UI組件

    這篇文章主要為大家詳細(xì)介紹了Android布局技巧之創(chuàng)建可重用的UI組件,文中提到了include標(biāo)簽的使用方法,感興趣的小伙伴們可以參考一下
    2016-05-05
  • Android ExpandableListView用法示例詳解

    Android ExpandableListView用法示例詳解

    ExpandableListView 是 Android 中一個(gè)非常實(shí)用的列表控件,它可以幫助我們實(shí)現(xiàn)具有分組功能的列表展示,通過本文的介紹,你應(yīng)該已經(jīng)掌握了 ExpandableListView 的基本用法,感興趣的朋友跟隨小編一起看看吧
    2025-02-02
  • Android小米推送簡單使用方法

    Android小米推送簡單使用方法

    這篇文章主要為大家詳細(xì)介紹了Android小米推送簡單使用方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-01-01

最新評論

敦煌市| 宜丰县| 绥滨县| 光山县| 宁安市| 乐东| 宜黄县| 泽州县| 阆中市| 惠东县| 临朐县| 金塔县| 瑞金市| 白水县| 肥西县| 手机| 丰都县| 汉寿县| 新竹市| 柘城县| 西充县| 黄陵县| 大厂| 河津市| 金山区| 桐城市| 莱阳市| 来凤县| 彰化市| 砀山县| 永吉县| 曲水县| 囊谦县| 竹北市| 游戏| 揭东县| 福海县| 探索| 宁陕县| 高陵县| 乌拉特中旗|