導航:首頁 > 操作系統 > androidcanvas放大

androidcanvas放大

發布時間:2023-03-14 21:23:27

1. android中怎樣實現對畫布的縮放

  1. Canvas類提供了很多「畫「的方法,先來建一個類,繼承自View。讓畫布鋪在View上而顯示出來(這也是自定義UI組件的路子),源碼如下:


2. android canvas的drawText方法 如何設置字體大小和格式。

Canvas相當於畫布,字體的大小格式在Paint上設置才正確, Paint 相當於畫筆。代碼如下,沒有具體參數:

Paint paint = new Paint();

paint.setTextSize(textSize);//設置字體大小

paint.setTypeface(typeface);//設置字體類型

canvas.drawText(text, x, y, paint);//使用畫筆paint

@Override

public void onDraw (Canvas canvas) {

Rect targetRect = new Rect(50, 50, 1000, 200);

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

paint.setStrokeWidth(3);

paint.setTextSize(80);

String testString = "測試:ijkJQKA:1234";

paint.setColor(Color.CYAN);

canvas.drawRect(targetRect, paint);

paint.setColor(Color.RED);

FontMetricsInt fontMetrics = paint.getFontMetricsInt();

(2)androidcanvas放大擴展閱讀:

Screen Space - Camera

此模式類似Screen Space - Overlay,但區別是此模式將Canvas放置於某個Camera前固定距離。此Camera負責渲染所有UI元素,則攝像機參數(Camera Settings)直接影響UI表現。

比如Camera是透視模式(Perspective),則UI元素會基於Field of View的值而扭曲變形。同樣的,若屏幕解析度變更,或者視覺平截體(CameraFrustrum)改變,則Canvas自動調整自身尺寸作自適應。

3. 您好,android里如何把圖片放大超過屏幕大小和拖動呢就像相冊里一樣。我試過很多辦法都不行。

是要編寫一個這樣的功能么,android提供的API裡面一般圖片都是Bitmap,可以通過Canvas.drawBItMap的方法在View進行圖片的繪制,在方法中需要進行傳入一個類型為Matrix的參數,設置Martrix的一些參數就可以進行圖片的放大的繪制,這只是顯示,也就是MVC中的View層,然後通過提供的一些觸摸函數的重寫並實現自己需要的一些功能,如拖動,實際上就是改變BitMap繪制的位置。關於觸摸的處理和圖片的繪制可以在網上進行一些教程的搜索,我就不羅列了,最終就是需要通過控制函數來改變圖片的繪制方式,這也許就是你所需要的功能。

4. Android繪圖之Canvas變換(6)

前面講解了Canvas的基本概念, Android繪圖之Canvas概念理解(5) ,
對Canvas的概念進行了分析,但是沒有說明和屏幕的關系,Canvas不等於屏幕,屏幕不會動的,我們也無法對屏幕進行(平移,縮放等)操作,只能對Canvas進行操作,所以對Canvas進行操作,屏幕不動,最終會導致看到的圖像不同。

下面開始講解Canvas的變幻操作:
包括:translate,rotate,scale,skew,clip,clipout,matrix

先從最簡單的平移開始:

對Canvas進行平移,
dx: x軸方向進行平移,正值向屏幕右側
dy:y軸方向進行平移,正值向屏幕下方

繪制兩個點查看原點位置。

原點顯然改變了,以後再繪制任何形狀都是以translate後的原點開始繪制。

參數說明
sx:橫向的縮放,默認為1,小數縮小,整數放大
sy:縱向的縮放,默認為1,小數縮小,整數放大

px,py,看源碼知道是先translate,執行sx,sy然後再translate反方向。
第二次translate的坐標為(-px sx,-px sy),最終的效果就是px,py是縮放後不動的點。

縮放後坐標減半。

如果想控制縮放後的位置,如何控制呢,這就需要第二個函數。

還可以控制其他位置,例如控制縮放後在中心。

rotate有兩個函數:
rotate(float degrees)
rotate(float degrees, float px, float py)
Degree:旋轉的角度,正值為順時針,負值為逆時針
Px,py:旋轉的中心,如果不指定旋轉中心默認為(0,0)點

指定旋轉中心為矩形中心

參數說明:
sx:畫布在x方向上傾斜相應的角度,sx傾斜角度的tan值,
sy:畫布在y軸方向上傾斜相應的角度,sy為傾斜角度的tan值,

根據矩形或者路徑裁剪畫布,畫布被切割之後,只有部分區域可用,其他區域無法繪制內容。
Clip函數切割的區域可用,clipOut未被切割的區域可用。(過時函數不再講解)

Matrix提供了一些方法來控制變換:

android繪圖之Paint(1)
android繪圖之Canvas基礎(2)
Android繪圖之Path(3)
Android繪圖之drawText繪制文本相關(4)
Android繪圖之Canvas概念理解(5)
Android繪圖之Canvas變換(6)
Android繪圖之Canvas狀態保存和恢復(7)
Android繪圖之PathEffect (8)
Android繪圖之LinearGradient線性漸變(9)
Android繪圖之SweepGradient(10)
Android繪圖之RadialGradient 放射漸變(11)
Android繪制之BitmapShader(12)
Android繪圖之ComposeShader,PorterDuff.mode及Xfermode(13)
Android繪圖之drawText,getTextBounds,measureText,FontMetrics,基線(14)
Android繪圖之貝塞爾曲線簡介(15)
Android繪圖之PathMeasure(16)
Android 動態修改漸變 GradientDrawable

5. android地圖縮小放大的時候maker之間聚合是什麼原理

<1>GeoPoint

表示一個地理坐標點,存放經度和緯度,以微度的整數形式存儲。

方法

GeoPoint(int latitudeE6, int longitudeE6)用給定的經緯度構造一個GeoPoint

方法介紹:

public int getLatitudeE6()

返回GeoPoint的緯度,單位微度

public int getLongitudeE6()

返回GeoPoint的經度,單位微度

public void setLatitudeE6(int latitudeE6)

設置GeoPoint的緯度,單位微度

public void setLongitudeE6(int longitudeE6)

設置GeoPoint的經度,單位微度

<2>介面 Projection

該介面用來在屏幕像素x/y坐標系和地球經緯度坐標系之間進行轉換,通過 MapView.getProjection()來取得映射類。

GeoPoint fromPixels(int x, int y)

該方法用給定的像素坐標創建一個新的GeoPoint。
給定的像素點是以MapView的左上角為原點的坐標系統,MapView提供了這個像素轉換器(PixelConverter)。 參數:result -
搜索結果iError - 錯誤號,0表示正確返回

Point toPixels(GeoPoint in, Point out)

把給定的GeoPoint變換到相對於MapView左上角的屏幕像素坐標。MapView提供了這種投影變換。 參數:in - 待變換的一對經緯度out
- 一個用於輸出預先存在的對象;如果為空,將返回一個新分配的像素點。

<3>MapController

處理地圖移動和縮放的工具類。

返回類型方法

voidanimateTo(GeoPoint point)對以給定的點GeoPoint,開始動畫顯示地圖。

voidanimateTo(GeoPoint point, Message message)對以給定的GeoPoint,開始動畫顯示地圖。

booleanonKey(View v, int keyCode, KeyEvent event)處理按鍵事件,把事件變換為適度的地圖平移。

voidscrollBy(int x, int y)按照給定的像素數據量滾動。

voidsetCenter(GeoPoint point)在給定的中心點GeoPoint上設置地圖視圖。

intsetZoom(int zoomLevel)設置地圖的縮放級別。

voidstopAnimation(boolean
jumpToFinish)終止所有未完成的動畫,有條件的把地圖中心修正到已完成的特殊動畫的偏移量上去。

voidstopPanning()重新設置平移狀態,使地圖靜止。

booleanzoomIn()放大一個級別。

booleanzoomInFixing(int xPixel, int yPixel)放大一個級別。

booleanzoomOut()縮小一個級別。

booleanzoomOutFixing(int xPixel, int yPixel)縮小一個級別。

voidzoomToSpan(int latSpanE6, int lonSpanE6)嘗試調整地圖的縮放,以便顯示給定的經緯度范圍。

<4>MapView

一個顯示地圖的視圖,當被焦點選中時,它能捕獲按鍵事件和觸摸手勢去平移和縮放地圖。

返回類型方法

booleancanCoverCenter()檢查當前是否有地圖貼片覆蓋地圖中心點。

protected booleancheckLayoutParams (android.view.ViewGroup.LayoutParams
p)僅檢查p是否是的一個MapView.LayoutParams實例。

voidcomputeScroll()捕獲滾動事件,用它們去平移地圖。

voiddisplayZoomControls(boolean takeFocus)顯示縮放控制項,可以選擇是否請求焦點選中以便通過按鍵訪問。

protected
android.view.ViewGroup.()返回一個Layout參數的集合,其中參數帶有ViewGroup.LayoutParams.WRAP_CONTENT的寬度,ViewGroup.LayoutParams.WRAP_CONTENT高度和坐標(0,0)。

protected
android.view.ViewGroup.(android.view.ViewGroup.LayoutParams
p)

android.view.ViewGroup.(AttributeSet
attrs)

MapControllergetController()返回地圖的MapController,這個對象可用於控制和驅動平移和縮放。

intgetLatitudeSpan()當前緯線的跨度(從地圖的上邊緣到下邊緣),十進制度×1,000,000。

intgetLongitudeSpan()當前經度的跨度(從地圖的左邊緣到地圖的右邊緣),單位:十進制的度×1,000,000。

GeoPointgetMapCenter()返回當前地圖中心點位置,做為一個GeoPoint(經度、緯度)的對象。

intgetMaxZoomLevel()返回當前視圖中心點的最大縮放級別。

java.util.ListgetOverlays()獲取Overlay列表。

ProjectiongetProjection()獲取屏幕像素坐標和經緯度對之間的轉換。

ViewgetZoomControls()已過時。

intgetZoomLevel()返回當前地圖的縮放級別。

booleanisSatellite()

booleanisStreetView()

booleanisTraffic()是否顯示交通流量。

protected voidonDetachedFromWindow()當被分離調用,清除縮放控制項。

protected voidonDraw(Canvas canvas)

voidonFocusChanged(boolean hasFocus, int direction, Rect
previouslyFocusedRect)當這個視圖的焦點狀態變化時被視圖系統調用。

booleanonKeyDown(int keyCode, KeyEvent event)把按鍵傳送到overlay。

booleanonKeyUp(int keyCode, KeyEvent event)把按鍵傳送到overlay。

protected voidonLayout(boolean flag, int l, int t, int r, int b)

protected voidonMeasure(int widthMeasureSpec, int heightMeasureSpec)

voidonRestoreInstanceState(Bundle state)把MapView的狀態恢復到一個Bundle。

voidonSaveInstanceState(Bundle state)把MapView的狀態存儲到一個Bundle中。

protected voidonSizeChanged(int w, int h, int oldw, int
oldh)重新調整地圖對象的尺寸。

booleanonTouchEvent(MotionEvent
event)首先把touch事件傳送到overlay,如果它不處理它們,就把事件再傳送到手勢探測器,然後分發探測到的手勢。

booleanonTrackballEvent(MotionEvent
event)把trackball事件首先傳送到overlay,如果它們不處理消息,嘗試取平移和點擊。

voidonWindowFocusChanged(boolean hasFocus)當包含這個視圖的窗口得到或是去焦點時被調用。

voidpreLoad()

voidsetDrawOverlayWhenZooming(boolean bDraw)設置在縮放動畫過程中是否繪制overlay,默認為不繪制。
如果繪制,在覆蓋物很多的情況下效率會有損失。 自1.1版本之後支持。

voidsetBuiltInZoomControls(boolean on)設置是否啟用內置的縮放控制項。

voidsetReticleDrawMode(com..mapapi.MapView.ReticleDrawMode
mode)暫不支持。

voidsetSatellite(boolean on)設置是否打開衛星圖。

voidsetStreetView(boolean on)暫不支持。

voidsetTraffic(boolean on)設置是否打開交通流量圖層。

voidregMapViewListener(BMapManager bmapMan, MKMapViewListener
listener)注冊地圖顯示事件監聽器。

<5>MyLocationOverlay

一個負責顯示用戶當前位置的Overlay。

Overlay是一個覆蓋,它繪制用戶當前在地圖上的位置(精準度),和/或一個嵌入的指南針。子類能覆蓋方法dispatchTap()去處理對當前位置的點擊。

為了開啟這個overlay的功能,需要去調用enableMyLocation()和/或enableCompass(),
或調用Activity中的Activity.onResume()方法。記住,當在後台是,要在Activity中的Activity.onPause()方法中調用相應的disableMyLocation()和/或disableCompass()關閉這個功能。

返回類型方法

voiddisableCompass()關閉指南針的更新。

voiddisableMyLocation()停止位置更新。

protected booleandispatchTap()在「我的位置」坐標上處理點擊事件。

booleandraw(Canvas canvas, MapView mapView, boolean shadow, long
when)繪制方法。

protected voiddrawCompass(android.graphics.Canvas canvas, float
bearing)繪制指南針。

protected voiddrawMyLocation(Canvas canvas, MapView mapView,
android.location.Location lastFix, GeoPoint myLocation, long when)繪制「我的位置」點。

booleanenableCompass()開啟指南針更新功能。

booleanenableMyLocation()嘗試開啟MyLocation功能,並向MKLocationManager.GPS_PROVIDER和MKLocationManager.NETWORK_PROVIDER注冊更新。

LocationgetLastFix()返回一個位置,對應於最近設定的用戶位置。

GeoPointgetMyLocation()返回一個GeoPoint,對應於一個最近設定的用戶位置。

floatgetOrientation()返回最近設定的的指南針朝向。

booleanisCompassEnabled()檢查指南針小部件是否被顯示。

booleanisMyLocationEnabled()

voidonAccuracyChanged(Sensor sensor, int accuracy)

voidonLocationChanged(Location location)監聽並獲取位置更新。

voidonProviderDisabled(java.lang.String provider)

voidonProviderEnabled(java.lang.String provider)

voidonSensorChanged(SensorEvent event)當指南針的值變換時,由SensorManager調用。

booleanonSnapToItem(int x, int y, android.graphics.Point snapPoint, MapView
mapView)檢查給定的(x,y)是否和引起當前行為(如縮放)的item足夠靠近。

booleanonTap(GeoPoint p, MapView mapView)檢查點擊的位置是否非常接近於當前的位置(如果已知)。

booleanrunOnFirstFix(java.lang.Runnable
runnable)把一個runnable加入隊列,一旦收到一個位置信息,這個runnable就被執行。

<6>Overlay

Overlay是一個基類,它表示可以顯示在地圖上方的覆蓋overlay。
添加一個overlay時,從這個基類派生出一個子類,創建一個實例,然後把它加入到一個列表中。這個列表通過調用MapView.getOverlays()得到。為了允許用戶觸摸去對齊一個點,子類應當實現Overlay.Snappable介面。

返回類型方法

booleandraw(Canvas canvas, MapView mapView, boolean
shadow)在地圖上繪制overlay。

booleandraw(Canvas canvas, MapView mapView, boolean shadow, long
when)專門繪制動畫overlay的調用。

protected static voiddrawAt(Canvas canvas, Drawable drawable, int x, int y,
boolean bShadow)在某個偏移位置畫一個Drawable的便捷方法。

booleanonKeyDown(int keyCode, KeyEvent event, MapView
mapView)處理一個按鍵被按下的事件。

booleanonKeyUp(int keyCode, KeyEvent event, MapView mapView)處理一個按鍵放開事件。

booleanonTap(GeoPoint p, MapView mapView)處理一個「點擊」事件。

booleanonTouchEvent(MotionEvent e, MapView mapView)處理一個觸摸事件。

booleanonTrackballEvent(MotionEvent e, MapView mapView)處理一個軌跡球事件。

6. android如何對viewpager裡面的圖片進行縮放

跟ViewPager沒有關系。對圖片的操作是ImageView,用Matrix來對圖片進行旋轉、縮放、平移等操作,查查Matrix和ImageView的相關內容。

7. Android 怎麼使用Bitmap+Canvas 自適應屏幕

我們可以使用Matrix 來放縮我們得到的Bitmap 從而使我們的BItmap適應我們的手機屏幕

首先我們得先獲取我們的手機屏幕的大小

WindowManagerwm=(WindowManager)getContext().getSystemService(
Context.WINDOW_SERVICE);
intwidth=wm.getDefaultDisplay().getWidth();
intheight=wm.getDefaultDisplay().getHeight();

然後我們構造一個新的Matrix對象,自己完成寫一個函數,如下:

publicBitmapresizeBitmap(Bitmapbitmap,intw,inth)
{
if(bitmap!=null)
{
intwidth=bitmap.getWidth();
intheight=bitmap.getHeight();
intnewWidth=w;
intnewHeight=h;
floatscaleWight=((float)newWidth)/width;
floatscaleHeight=((float)newHeight)/height;
Matrixmatrix=newMatrix();
matrix.postScale(scaleWight,scaleHeight);
Bitmapres=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
returnres;

}
else{
returnnull;
}
}

這樣我們通過這個函數返回的Bitmap對象就是可以適應我們手機屏幕大小的了。。

閱讀全文

與androidcanvas放大相關的資料

熱點內容
安卓怎麼關許可權保護隱私 瀏覽:390
海牛微視app怎麼用 瀏覽:70
單片機怎樣選變壓器 瀏覽:829
癌症pdf 瀏覽:725
雲伺服器鏡像批量部署環境 瀏覽:683
安卓手機瀏覽器能訪問什麼網站 瀏覽:254
找不到網站的伺服器ip地址該如何解決 瀏覽:743
演算法十個數降序排列 瀏覽:95
基於單片機的老年人健康監測系統 瀏覽:706
python入門經典pdf下載 瀏覽:17
東芝變頻2p空調壓縮機 瀏覽:227
自家wifi怎麼能加密 瀏覽:644
紅米k40加密門禁卡 瀏覽:847
什麼樣的源碼好看 瀏覽:156
手機主伺服器有什麼用 瀏覽:612
程序編寫命令 瀏覽:597
android發送心跳包 瀏覽:385
指標源碼和原理 瀏覽:700
汽車空調壓縮吸盤 瀏覽:208
崽崽因app版本不同不能邀請怎麼辦 瀏覽:686