一. 問題描述
當(dāng)用戶通過縮放手勢、平移手勢、傾斜手勢和旋轉(zhuǎn)手勢與地圖交互,控制地圖移動改變其可見區(qū)域時,華為地圖SDK沒有提供直接獲取用戶手勢類型的API。
二. 解決方案
- 華為地圖SDK的地圖相機(jī)有提供CameraPosition類,此類包括所有相機(jī)位置參數(shù),如位置、方位、傾斜角度和縮放級別。具體可以查看下圖:
-
華為地圖SDK同時也有提供地圖相機(jī)的移動偵聽事件,應(yīng)用層可以通過設(shè)置偵聽器對地圖相機(jī)的移動狀態(tài)進(jìn)行偵聽,比如地圖相機(jī)開始移動、停止移動等事件。
-
如果要判斷用戶與地圖的交互手勢,可以在地圖相機(jī)開始移動的偵聽事件中分別記錄target、bearing、tilt和zoom的初始值。在地圖相機(jī)移動結(jié)束的偵聽事件中重新獲取target、bearing、tilt和zoom的最終值。
-
分別計算target、bearing、tilt和zoom的初始值與最終值是否有變動,來判斷用戶與地圖的交互手勢類型。
三. 代碼示例及效果展示
- 創(chuàng)建地圖實例并實現(xiàn)地圖相機(jī)移動的偵聽事件。
a. 在Activity的布局文件中添加地圖控件且設(shè)置地圖屬性。
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:map="http://schemas.android.com/apk/res-auto"
android:id="@+id/mapfragment_camera_gesturetype"
class="com.huawei.hms.maps.SupportMapFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
map:cameraTargetLat="48.893478"
map:cameraTargetLng="2.334595"
map:cameraZoom="10" />
</androidx.constraintlayout.widget.ConstraintLayout>
b. 在Activity中初始化SDK、加載地圖并實現(xiàn)地圖相機(jī)的偵聽事件。
public class HwMapCameraGestureTypeActivity extends AppCompatActivity implements OnMapReadyCallback,
HuaweiMap.OnCameraMoveStartedListener, HuaweiMap.OnCameraMoveListener, HuaweiMap.OnCameraIdleListener {
public static String LOG_TAG_MAP = "HW_MAP_LOG";
private SupportMapFragment mSupportMapFragment;
//HuaweiMap對象
private HuaweiMap huaweiMap;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 初始化SDK
MapsInitializer.initialize(this);
setContentView(R.layout.activity_hwmap_camera_gesturetype);
//加載地圖
mSupportMapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfragment_camera_gesturetype);
mSupportMapFragment.getMapAsync(this);
}
//地圖初始化成功的回調(diào)方法
@Override
public void onMapReady(HuaweiMap huaweiMap) {
this.huaweiMap = huaweiMap;
//設(shè)置地圖相機(jī)的移動偵聽事件
this.huaweiMap.setOnCameraMoveStartedListener(this);
this.huaweiMap.setOnCameraMoveListener(this);
this.huaweiMap.setOnCameraIdleListener(this);
}
//地圖相機(jī)開始移動的回調(diào)
@Override
public void onCameraMoveStarted(int i) {
Log.w(LOG_TAG_MAP, "地圖相機(jī)開始移動");
}
//地圖相機(jī)移動過程中的回調(diào)
@Override
public void onCameraMove() {
}
//地圖相機(jī)移動結(jié)束的回調(diào)
@Override
public void onCameraIdle() {
Log.w(LOG_TAG_MAP, "地圖相機(jī)結(jié)束移動");
}
}
c. 經(jīng)下方的Gif圖可看出,當(dāng)?shù)貓D相機(jī)開始移動和結(jié)束移動時,分別有對應(yīng)的日志打印出來:
- 新建initZoomValue, initTiltValue, initBearingValue對象,用來記錄地圖相機(jī)移動時的初始屬性值,并在onCameraMoveStarted(int i)監(jiān)聽方法中對新建對象進(jìn)行賦值:
/**
* 初始值對象
* initZoomValue-屏幕中心附近的縮放級別初始值。
* initTiltValue-相機(jī)角度與垂直于地球表面的線的夾角初始值。
* initBearingValue-相機(jī)指向的方向初始值。
*/
private float initZoomValue, initTiltValue, initBearingValue;
//地圖相機(jī)開始移動的回調(diào)
@Override
public void onCameraMoveStarted(int i) {
Log.w(LOG_TAG_MAP, "地圖相機(jī)開始移動");
if (null != huaweiMap && null != huaweiMap.getCameraPosition()) {
//記錄相機(jī)移動時的相機(jī)各個屬性的初始值
initZoomValue = huaweiMap.getCameraPosition().zoom;
initTiltValue = huaweiMap.getCameraPosition().tilt;
initBearingValue = huaweiMap.getCameraPosition().bearing;
}
}
- 在onCameraIdle()方法中,計算用戶與地圖相機(jī)的交互類型。
//地圖相機(jī)移動結(jié)束的回調(diào)
@Override
public void onCameraIdle() {
//計算用戶與相機(jī)的交互手勢類型
if (null != huaweiMap && null != huaweiMap.getCameraPosition()) {
//通過計算zoom的值是否發(fā)生變化 判斷用戶與地圖交互類型是平移還是旋轉(zhuǎn)
if (initZoomValue != huaweiMap.getCameraPosition().zoom) {
Log.w(LOG_TAG_MAP, "地圖相機(jī)結(jié)束移動,移動類型為:縮放");
} else {
Log.w(LOG_TAG_MAP, "地圖相機(jī)結(jié)束移動,移動類型為:平移");
}
//通過計算Tilt的值是否發(fā)生變化 判斷用戶與地圖交互類型是否是傾斜手勢
if (initTiltValue != huaweiMap.getCameraPosition().tilt) {
Log.w(LOG_TAG_MAP, "地圖相機(jī)結(jié)束移動,移動類型為:傾斜");
}
//通過計算Bearing的值是否發(fā)生變化 判斷用戶與地圖交互類型是否是旋轉(zhuǎn)手勢
if (initBearingValue != huaweiMap.getCameraPosition().bearing) {
Log.w(LOG_TAG_MAP, "地圖相機(jī)結(jié)束移動,移動類型為:旋轉(zhuǎn)");
}
}
}
- 可通過下方的Gif圖看一下具體效果:
a. 平移和縮放手勢類型:
b. 旋轉(zhuǎn)手勢類型:
c. 傾斜手勢類型:
四. 參考資料
-
創(chuàng)建地圖實例
-
地圖相機(jī)移動偵聽
-
地圖相機(jī)屬性
了解更多詳情>>
訪問地圖服務(wù)聯(lián)盟官網(wǎng)
獲取地圖服務(wù)開發(fā)指導(dǎo)文檔
訪問HMS Core 聯(lián)盟官網(wǎng)
獲取HMS Core 開發(fā)指導(dǎo)文檔文章來源:http://www.zghlxwxcb.cn/news/detail-612085.html
關(guān)注我們,第一時間了解 HMS Core 最新技術(shù)資訊~文章來源地址http://www.zghlxwxcb.cn/news/detail-612085.html
到了這里,關(guān)于【FAQ】關(guān)于無法判斷和區(qū)分用戶與地圖交互手勢類型的解決辦法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!