亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能

系統(tǒng) 2386 0

轉(zhuǎn)載請注明出處: http://blog.csdn.net/xiaanming/article/details/11821523


貌似有些天沒有寫博客了,前段時(shí)間在忙找工作的事,面試了幾家公司,表示反響還不錯(cuò),過完國慶節(jié)去新公司報(bào)道,期待新的公司,新的同事,而且新公司還有很多女孩子,哈哈,我可是一年多沒和女孩子一起工作過了,之前的公司全是男的,你沒聽錯(cuò),真的全是男的,我還以為我自己不會在愛了,現(xiàn)在Android市場還可以,想要跳槽換工作的趕緊,過了這個(gè)村就沒這個(gè)店了,還有就是恭喜自己成了博客專家了,很開心也很感謝CSDN給我這份榮譽(yù),我會繼續(xù)寫出對大家有用的博文,感謝大家的支持,今天繼續(xù)給大家?guī)戆俣鹊貓D開發(fā)系列三 ,實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件,先看下項(xiàng)目工程結(jié)構(gòu)

Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件

ScaleView是比例尺控件,ZoomControlView是縮放控件,MainActivity就是我們的主界面了


先看下ZoomControlView類,代碼如下

    package com.example.baidumapdemo;

import com.baidu.mapapi.map.MapView;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.view.View.OnClickListener;

public class ZoomControlView extends RelativeLayout implements OnClickListener{
	private Button mButtonZoomin;
	private Button mButtonZoomout;
	private MapView mapView;
	private int maxZoomLevel;
	private int minZoomLevel;
	
	public ZoomControlView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public ZoomControlView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init();
	}

	
	private void init() {
		View view = LayoutInflater.from(getContext()).inflate(R.layout.zoom_controls_layout, null);
		mButtonZoomin = (Button) view.findViewById(R.id.zoomin);
		mButtonZoomout = (Button) view.findViewById(R.id.zoomout);
		mButtonZoomin.setOnClickListener(this);
		mButtonZoomout.setOnClickListener(this);
		addView(view);
	}

	@Override
	public void onClick(View v) {
		if(mapView == null){
			throw new NullPointerException("you can call setMapView(MapView mapView) at first");
		}
		switch (v.getId()) {
		case R.id.zoomin:{
			mapView.getController().zoomIn();
			break;
		}
		case R.id.zoomout:{
			mapView.getController().zoomOut();
			break;
		}
		}
	}

	/**
	 * 與MapView設(shè)置關(guān)聯(lián)
	 * @param mapView
	 */
	public void setMapView(MapView mapView) {
		this.mapView = mapView;
		// 獲取最大的縮放級別
		maxZoomLevel = mapView.getMaxZoomLevel();
		// 獲取最大的縮放級別
		minZoomLevel = mapView.getMinZoomLevel();
	}
	
	
	/**
	 * 根據(jù)MapView的縮放級別更新縮放按鈕的狀態(tài),當(dāng)達(dá)到最大縮放級別,設(shè)置mButtonZoomin
	 * 為不能點(diǎn)擊,反之設(shè)置mButtonZoomout
	 * @param level
	 */
	public void refreshZoomButtonStatus(int level){
		if(mapView == null){
			throw new NullPointerException("you can call setMapView(MapView mapView) at first");
		}
		if(level > minZoomLevel && level < maxZoomLevel){
			if(!mButtonZoomout.isEnabled()){
				mButtonZoomout.setEnabled(true);
			}
			if(!mButtonZoomin.isEnabled()){ 
				mButtonZoomin.setEnabled(true);
			}
		}
		else if(level == minZoomLevel ){
			mButtonZoomout.setEnabled(false);
		}
		else if(level == maxZoomLevel){
			mButtonZoomin.setEnabled(false);
		}
	}

}
  


這個(gè)類封裝好了地圖的縮放功能,里面主要是兩個(gè)按鈕,一個(gè)按鈕是放大MapView,當(dāng)放大到了MapView的最大縮放級別,設(shè)置此按鈕的Enable為false,另一個(gè)按鈕縮小MapView,當(dāng)縮小到了MapView最小的縮放級別,設(shè)置此按鈕的Enable為false,refreshZoomButtonStatus()方法就是實(shí)現(xiàn)了此功能,我們根據(jù)MapView的縮放級別來更新按鈕的狀態(tài),我們還必須調(diào)用setMapView(MapView mapView)方法來設(shè)置ZoomControlView與MapView關(guān)聯(lián),ZoomControlView的布局文件zoom_controls_layout我就不貼出來了,里面就兩個(gè)按鈕,然后給按鈕設(shè)置背景選擇器seletor


ScaleView類的代碼如下

    
      package com.example.baidumapdemo;

import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.NinePatch;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Typeface;
import android.util.AttributeSet;
import android.view.View;

public class ScaleView extends View {
	private Paint mPaint;
	/**
	 * 比例尺的寬度
	 */
	private int scaleWidth;
	/**
	 * 比例尺的高度
	 */
	private int scaleHeight = 4;
	/**
	 * 比例尺上面字體的顏色
	 */
	private int textColor = Color.BLACK;
	/**
	 * 比例尺上邊的字體
	 */
	private String text;
	/**
	 * 字體大小
	 */
	private int textSize = 16;
	/**
	 * 比例尺與字體間的距離
	 */
	private int scaleSpaceText = 8;
	/**
	 * 百度地圖最大縮放級別
	 */
	private static final int MAX_LEVEL = 19;
	/**
	 * 各級比例尺分母值數(shù)組
	 */
	private static final int[] SCALES = {20, 50, 100, 200, 500, 1000, 2000,
			5000, 10000, 20000, 25000, 50000, 100000, 200000, 500000, 1000000,
			2000000 };
	/**
	 * 各級比例尺上面的文字?jǐn)?shù)組
	 */
	private static final String[] SCALE_DESCS = { "20米", "50米", "100米", "200米",
			"500米", "1公里", "2公里", "5公里", "10公里", "20公里", "25公里", "50公里",
			"100公里", "200公里", "500公里", "1000公里", "2000公里" };
	
	private MapView mapView;
	
	

	/**
	 * 與MapView設(shè)置關(guān)聯(lián)
	 * @param mapView
	 */
	public void setMapView(MapView mapView) {
		this.mapView = mapView;
	}

	public ScaleView(Context context) {
		this(context, null);
	}
	
	public ScaleView(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public ScaleView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		mPaint = new Paint();
	}

	
	/**
	 * 繪制上面的文字和下面的比例尺,因?yàn)楸壤呤?9.png,我們需要利用drawNinepath方法繪制比例尺
	 */
	@SuppressLint("DrawAllocation")
	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		
		int width = scaleWidth;
		
		mPaint.setColor(textColor);
		mPaint.setAntiAlias(true);
		mPaint.setTextSize(textSize);
		mPaint.setTypeface(Typeface.DEFAULT_BOLD);
		float textWidth = mPaint.measureText(text);
		
		canvas.drawText(text, (width - textWidth) / 2, textSize, mPaint);
		
		Rect scaleRect = new Rect(0, textSize + scaleSpaceText, scaleWidth, textSize + scaleSpaceText + scaleHeight);
		drawNinepath(canvas, R.drawable.icon_scale, scaleRect);
	}
	
	/**
	 * 手動繪制.9.png圖片
	 * @param canvas
	 * @param resId
	 * @param rect
	 */
	private void drawNinepath(Canvas canvas, int resId, Rect rect){  
        Bitmap bmp= BitmapFactory.decodeResource(getResources(), resId);  
        NinePatch patch = new NinePatch(bmp, bmp.getNinePatchChunk(), null);  
        patch.draw(canvas, rect);  
    }

	

	/**
	 * 測量ScaleView的方法,
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		int widthSize = getWidthSize(widthMeasureSpec);
		int heightSize = getHeightSize(heightMeasureSpec);
		setMeasuredDimension(widthSize, heightSize);
	}
	
	/**
	 * 測量ScaleView的寬度
	 * @param widthMeasureSpec
	 * @return
	 */
	private int getWidthSize(int widthMeasureSpec){
		return MeasureSpec.getSize(widthMeasureSpec);
	}
	
	/**
	 * 測量ScaleView的高度
	 * @param widthMeasureSpec
	 * @return
	 */
	private int getHeightSize(int heightMeasureSpec){
		int mode = MeasureSpec.getMode(heightMeasureSpec);
		int height = 0;
		switch (mode) {
		case MeasureSpec.AT_MOST:
			height = textSize + scaleSpaceText + scaleHeight;
			break;
		case MeasureSpec.EXACTLY:{
			height = MeasureSpec.getSize(heightMeasureSpec);
			break;
		}
		case MeasureSpec.UNSPECIFIED:{
			height = Math.max(textSize + scaleSpaceText + scaleHeight, MeasureSpec.getSize(heightMeasureSpec));
			break;
		}
		}
		
		return height;
	}
	
	/**
	 * 根據(jù)縮放級別,得到對應(yīng)比例尺在SCALES數(shù)組中的位置(索引)
	 * @param zoomLevel
	 * @return
	 */
	private static int getScaleIndex(int zoomLevel) {
		return MAX_LEVEL - zoomLevel;
	}

	/**
	 * 根據(jù)縮放級別,得到對應(yīng)比例尺
	 * 
	 * @param zoomLevel
	 * @return
	 */
	public static int getScale(int zoomLevel) {
		return SCALES[getScaleIndex(zoomLevel)];
	}

	/**
	 *  根據(jù)縮放級別,得到對應(yīng)比例尺文字
	 * @param zoomLevel
	 * @return
	 */
	public static String getScaleDesc(int zoomLevel) {
		return SCALE_DESCS[getScaleIndex(zoomLevel)];
	}

	
	/**
	 * 根據(jù)地圖當(dāng)前中心位置的緯度,當(dāng)前比例尺,得出比例尺圖標(biāo)應(yīng)該顯示多長(多少像素)
	 * @param map
	 * @param scale
	 * @return
	 */
	public static int meterToPixels(MapView map, int scale) {
		// 得到當(dāng)前中心位置對象
		GeoPoint geoPoint = map.getMapCenter();
		// 得到當(dāng)前中心位置緯度
		double latitude = geoPoint.getLatitudeE6() / 1E6;
		// 得到象素?cái)?shù),比如當(dāng)前比例尺是1/10000,比如scale=10000,對應(yīng)在該緯度應(yīng)在地圖中繪多少象素
		// 參考http://rainbow702.iteye.com/blog/1124244
		return (int) (map.getProjection().metersToEquatorPixels(scale) / (Math
				.cos(Math.toRadians(latitude))));
		
		
	}

	/**
	 * 設(shè)置比例尺的寬度
	 * @param scaleWidth
	 */
	public  void setScaleWidth(int scaleWidth) {
		this.scaleWidth = scaleWidth;
	}

	/**
	 * 設(shè)置比例尺的上面的 text 例如 200公里
	 * @param text
	 */
	private void setText(String text) {
		this.text = text;
	}

	/**
	 * 設(shè)置字體大小
	 * @param textSize
	 */
	public void setTextSize(int textSize) {
		this.textSize = textSize;
		invalidate();
	}
	
	
	/**
	 * 根據(jù)縮放級別更新ScaleView的文字以及比例尺的長度
	 * @param level
	 */
	public void refreshScaleView(int level) {
		if(mapView == null){
			throw new NullPointerException("you can call setMapView(MapView mapView) at first");
		}
		setText(getScaleDesc(level));
		setScaleWidth(meterToPixels(mapView, getScale(level)));
		invalidate();
	}

}
    
  

ScaleView是比例尺控件類,主要是提供比例尺的繪制功能,在onDraw(Canvas canvas)的方法中繪制上面的距離和下面的比例尺長度,這里面要說下drawNinepath()方法,因?yàn)槲覀兊谋壤邎D片是.9.png格式的,保證圖片拉伸狀態(tài)下不變形,如果用平常繪制一般圖片的方法會報(bào)ClassCastException,所以我們可以利用drawNinepath()來手動繪制.9.png格式的圖片,我們比例尺的長度是變化的,我們需要將 以米為計(jì)量單位的距離(沿赤道)在當(dāng)前縮放水平下轉(zhuǎn)換到一個(gè)以像素(水平)為計(jì)量單位的距離,meterToPixels()方法根據(jù)我們MapView當(dāng)前的縮放級別,得出比例尺圖標(biāo)應(yīng)該顯示多長,refreshScaleView()是用來更新ScaleView的,更新上面的字符串和下面比例尺的長度,當(dāng)然 我們也必須調(diào)用setMapView(MapView mapView)方法來設(shè)置 ScaleView 與MapView關(guān)聯(lián)


接下來我們就來使用我們的比例尺控件和縮放控件了,先看下布局

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <com.baidu.mapapi.map.MapView
        android:id="@+id/bmapView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:clickable="true" />

    <com.example.baidumapdemo.ZoomControlView
        android:id="@+id/ZoomControlView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_marginBottom="20.0dip"
        android:layout_marginRight="5.0dip"/>

    <com.example.baidumapdemo.ScaleView
        android:id="@+id/scaleView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true"
        android:layout_marginBottom="40dp"
        android:layout_marginLeft="20dp" />

</RelativeLayout>
  
主界面MainActivity的代碼如下

    package com.example.baidumapdemo;

import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.widget.Toast;

import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint;

public class MainActivity extends Activity{
	private BMapManager mBMapManager;
	/**
	 * MapView 是地圖主控件
	 */
	private MapView mMapView = null;
	/**
	 * 用MapController完成地圖控制
	 */
	private MapController mMapController = null;
	
	private ScaleView mScaleView;
	private ZoomControlView mZoomControlView;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		//使用地圖sdk前需先初始化BMapManager,這個(gè)必須在setContentView()先初始化
		mBMapManager = new BMapManager(this);
		
		//第一個(gè)參數(shù)是API key,
		//第二個(gè)參數(shù)是常用事件監(jiān)聽,用來處理通常的網(wǎng)絡(luò)錯(cuò)誤,授權(quán)驗(yàn)證錯(cuò)誤等,你也可以不添加這個(gè)回調(diào)接口
		mBMapManager.init("CC61ac7527b65c95899608810873b173", new MKGeneralListener() {
			
			//授權(quán)錯(cuò)誤的時(shí)候調(diào)用的回調(diào)函數(shù)
			@Override
			public void onGetPermissionState(int iError) {
				if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
					Toast.makeText(getApplication(), "API Key錯(cuò)誤,請檢查!",
	                        Toast.LENGTH_LONG).show();
	            }
			}
			
			//一些網(wǎng)絡(luò)狀態(tài)的錯(cuò)誤處理回調(diào)函數(shù)
			@Override
			public void onGetNetworkState(int iError) {
				if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
	                Toast.makeText(getApplication(), "您的網(wǎng)絡(luò)出錯(cuò)啦!",
	                    Toast.LENGTH_LONG).show();
	            }
			}
		});
		
		setContentView(R.layout.activity_main);
		mMapView = (MapView) findViewById(R.id.bmapView);
		//隱藏自帶的地圖縮放控件
		mMapView.setBuiltInZoomControls(false);
		
		mScaleView = (ScaleView) findViewById(R.id.scaleView);
		mScaleView.setMapView(mMapView);
		mZoomControlView = (ZoomControlView) findViewById(R.id.ZoomControlView);
		mZoomControlView.setMapView(mMapView);
		
		
		//地圖顯示事件監(jiān)聽器。 該接口監(jiān)聽地圖顯示事件,用戶需要實(shí)現(xiàn)該接口以處理相應(yīng)事件。
		mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
			
			@Override
			public void onMapMoveFinish() {
				 refreshScaleAndZoomControl();
			}
			
			@Override
			public void onMapLoadFinish() {
				
			}
			
			
			
			/**
			 * 動畫結(jié)束時(shí)會回調(diào)此消息.我們在此方法里面更新縮放按鈕的狀態(tài)
			 */
			@Override
			public void onMapAnimationFinish() {
				 refreshScaleAndZoomControl();
			}
			
			@Override
			public void onGetCurrentMap(Bitmap arg0) {
				
			}
			
			@Override
			public void onClickMapPoi(MapPoi arg0) {
				
			}
		});
		
		//獲取地圖控制器
        mMapController = mMapView.getController();
        //設(shè)置地圖是否響應(yīng)點(diǎn)擊事件  .
        mMapController.enableClick(true);
        //設(shè)置地圖縮放級別
        mMapController.setZoom(14);
        
        refreshScaleAndZoomControl();
        
        //保存精度和緯度的類,
        GeoPoint p = new GeoPoint((int)(22.547923 * 1E6), (int)(114.067368 * 1E6));
        //設(shè)置p地方為中心點(diǎn)
        mMapController.setCenter(p);
        
	}

	
	
	private void refreshScaleAndZoomControl(){
        //更新縮放按鈕的狀態(tài)
        mZoomControlView.refreshZoomButtonStatus(Math.round(mMapView.getZoomLevel()));
        mScaleView.refreshScaleView(Math.round(mMapView.getZoomLevel()));
	}
	
	
	@Override
	protected void onResume() {
    	//MapView的生命周期與Activity同步,當(dāng)activity掛起時(shí)需調(diào)用MapView.onPause()
		mMapView.onResume();
		super.onResume();
	}



	@Override
	protected void onPause() {
		//MapView的生命周期與Activity同步,當(dāng)activity掛起時(shí)需調(diào)用MapView.onPause()
		mMapView.onPause();
		super.onPause();
	}

	@Override
	protected void onDestroy() {
		//MapView的生命周期與Activity同步,當(dāng)activity銷毀時(shí)需調(diào)用MapView.destroy()
		mMapView.destroy();
		
		//退出應(yīng)用調(diào)用BMapManager的destroy()方法
		if(mBMapManager != null){
			mBMapManager.destroy();
			mBMapManager = null;
		}
		
		super.onDestroy();
		
	}

}

  

主界面的代碼還是比較簡單的,主要是利用MapView的 regMapViewListener()來注冊 地圖顯示事件監(jiān)聽器。 該接口監(jiān)聽地圖顯示事件,用戶需要實(shí)現(xiàn)該接口以處理相應(yīng)事件,分別在回調(diào)方法 onMapAnimationFinish()和 onMapMoveFinish()來更新 ZoomControlView和ScaleView的一些狀態(tài)

在運(yùn)行之前需要在Manifest中加入相對應(yīng)的權(quán)限問題

        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />  
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />  
    <uses-permission android:name="android.permission.INTERNET" />  
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />  
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />  
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />  
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
  

運(yùn)行結(jié)果

Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件 Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件 Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件


好了,今天的講解到此結(jié)束,有疑問的朋友請?jiān)谙旅媪粞裕?


上面的代碼有些東西沒有貼出來,有興趣的朋友可以下載源碼 項(xiàng)目源碼,點(diǎn)擊下載


Android 百度地圖開發(fā)(三)--- 實(shí)現(xiàn)比例尺功能和替換自帶的縮放組件


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 日本亚洲一区二区三区 | 免费毛片网 | 免费看欧美毛片大片免费看 | 国产日韩亚洲欧洲一区二区三区 | 爽爽影院在线免费观看 | 九九精品免视看国产成人 | 奇米影视狠狠久久中文 | 337p欧洲亚洲大胆艺术 | 日韩久久一区二区三区 | 成人欧美一区二区三区白人 | 羞羞视频网站 | 欧美同房免姿势108费视频 | 久久午夜一区二区 | 久久久青草 | 日日撸 | www四虎影院| 欧美激情视频二区 | 久久综合操| 中文国产成人精品少久久 | 国产一区二区三区高清 | 久久频这里精品99香蕉久 | 国模无水印一区二区三区 | 日韩a毛片| 国产99免费视频 | 国产亚洲精品久久久久久久网站 | 亚洲国产日产韩国欧美综合 | 免费观看成人www精品视频在线 | 日本网站在线播放 | 国产亚洲福利精品一区二区 | 国产人成精品免费视频 | 亚洲狠狠婷婷综合久久久图片 | 在线观看免费毛片 | ass最极品女人下部pic | 中文字幕国产视频 | 美美女高清毛片视频黄的一免费 | 欧美性猛交ⅹxxx乱大交免费 | 一区二区三区四区国产 | 国产精品国产福利国产秒拍 | 午夜一级视频 | 亚洲自拍成人 | 精品福利影院 |