1. android中怎样实现对画布的缩放
工具准备
画布:Canvas来响应画画(draw)的调用(并将其写入bitmap);
具体操作
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对象就是可以适应我们手机屏幕大小的了。。