Android 如何自定义控件(继承View)
来源:互联网 发布:怎么查IP端口开关 编辑:程序博客网 时间:2024/05/06 08:45
该例子演示的是如何自定义罗盘的控件
activity_mian.xml代码:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <com.paad.compass.CompassView android:id="@+id/compassView" android:layout_width="match_parent" android:layout_height="match_parent" /></FrameLayout>
在strings.xml里面添加:
<?xml version="1.0" encoding="utf-8"?><resources> <string name="app_name">Compass</string> <string name="cardinal_north">N</string> <string name="cardinal_east">E</string> <string name="cardinal_south">S</string> <string name="cardinal_west">W</string></resources>
在colors.xml代码如下:
<?xml version="1.0" encoding="utf-8"?><resources> <color name="background_color">#F555</color> <color name="marker_color">#AFFF</color> <color name="text_color">#AFFF</color></resources>
CompassView.java代码:
package com.paad.compass;import android.content.Context;import android.content.res.Resources;import android.graphics.Canvas;import android.graphics.Paint;import android.util.AttributeSet;import android.view.View;import android.view.accessibility.AccessibilityEvent;public class CompassView extends View { private float bearing; public void setBearing(float _bearing) { bearing = _bearing; sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED); } public float getBearing() { return bearing; } private Paint markerPaint; private Paint textPaint; private Paint circlePaint; private String northString; private String eastString; private String southString; private String westString; private int textHeight; public CompassView(Context context) { super(context); initCompassView(); } public CompassView(Context context, AttributeSet attrs) { super(context, attrs); initCompassView(); } public CompassView(Context context, AttributeSet ats, int defaultStyle) { super(context, ats, defaultStyle); initCompassView(); } protected void initCompassView() { setFocusable(true); Resources r = this.getResources(); circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG); circlePaint.setColor(r.getColor(R.color.background_color)); circlePaint.setStrokeWidth(1); circlePaint.setStyle(Paint.Style.FILL_AND_STROKE); northString = r.getString(R.string.cardinal_north); eastString = r.getString(R.string.cardinal_east); southString = r.getString(R.string.cardinal_south); westString = r.getString(R.string.cardinal_west); textPaint = new Paint(Paint.ANTI_ALIAS_FLAG); textPaint.setColor(r.getColor(R.color.text_color)); textHeight = (int)textPaint.measureText("yY"); markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG); markerPaint.setColor(r.getColor(R.color.marker_color)); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // The compass is a circle that fills as much space as possible. // Set the measured dimensions by figuring out the shortest boundary, // height or width. int measuredWidth = measure(widthMeasureSpec); int measuredHeight = measure(heightMeasureSpec); int d = Math.min(measuredWidth, measuredHeight); setMeasuredDimension(d, d); } private int measure(int measureSpec) { int result = 0; // Decode the measurement specifications. int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.UNSPECIFIED) { // Return a default size of 200 if no bounds are specified. //如果没有指定界限,返回默认大小200 result = 200; } else { // As you want to fill the available space // always return the full available bounds. result = specSize; } return result; } @Override protected void onDraw(Canvas canvas) { int mMeasuredWidth = getMeasuredWidth(); int mMeasuredHeight = getMeasuredHeight(); int px = mMeasuredWidth / 2; int py = mMeasuredHeight / 2 ; int radius = Math.min(px, py); // Draw the background canvas.drawCircle(px, py, radius, circlePaint); // Rotate our perspective so that the 詔op' is // facing the current bearing. canvas.save(); canvas.rotate(-bearing, px, py); int textWidth = (int)textPaint.measureText("W"); int cardinalX = px-textWidth/2; int cardinalY = py-radius+textHeight; // Draw the marker every 15 degrees and text every 45. for (int i = 0; i < 24; i++) { // Draw a marker. canvas.drawLine(px, py-radius, px, py-radius+10, markerPaint); canvas.save(); canvas.translate(0, textHeight); // Draw the cardinal points if (i % 6 == 0) { String dirString = ""; switch (i) { case(0) : { dirString = northString; int arrowY = 2*textHeight; canvas.drawLine(px, arrowY, px-5, 3*textHeight, markerPaint); canvas.drawLine(px, arrowY, px+5, 3*textHeight, markerPaint); break; } case(6) : dirString = eastString; break; case(12) : dirString = southString; break; case(18) : dirString = westString; break; } canvas.drawText(dirString, cardinalX, cardinalY, textPaint); } else if (i % 3 == 0) { // Draw the text every alternate 45deg String angle = String.valueOf(i*15); float angleTextWidth = textPaint.measureText(angle); int angleTextX = (int)(px-angleTextWidth/2); int angleTextY = py-radius+textHeight; canvas.drawText(angle, angleTextX, angleTextY, textPaint); } canvas.restore(); canvas.rotate(15, px, py); } canvas.restore(); } @Override public boolean dispatchPopulateAccessibilityEvent(final AccessibilityEvent event) { super.dispatchPopulateAccessibilityEvent(event); if (isShown()) { String bearingStr = String.valueOf(bearing); if (bearingStr.length() > AccessibilityEvent.MAX_TEXT_LENGTH) bearingStr = bearingStr.substring(0, AccessibilityEvent.MAX_TEXT_LENGTH); event.getText().add(bearingStr); return true; } else return false; }}
主要是重写onDraw方法和onMeasure方法来实现罗盘。
源码下载链接
0 0
- Android 如何自定义控件(继承View)
- Android自定义控件View(二)继承控件
- Android自定义控件-完全自定义(继承View ,ViewGroup)
- android初学者——自定义控件(继承View)
- android继承View实现复杂的自定义控件(1)
- android自定义控件(二) 入门,继承View
- android自定义控件(二) 入门,继承View
- Android-自定义控件之继承View
- android自定义控件(二) 入门,继承View
- android自定义控件(二) 入门,继承View
- Android 自定义控件之继承view
- 继承View自定义控件
- 自定义控件-继承View
- Android自定义View(三)继承View
- Android 自定义属性 view (继承View)
- android 自定义view(二),继承view
- android自定义控件(基于原有控件,即继承自view)
- android自定义View-继承
- win7 64位操作系统中 Oracle 11g 安装教程(图解)
- Nginx常用日志分割方法
- 使用response输出随机图片
- (六)mybatis学习之输入映射与输出映射
- servlet---用户登录验证欢迎
- Android 如何自定义控件(继承View)
- 移位(左移,右移和无符号右移)
- jvm(13)-线程安全与锁优化
- LayoutInflater解析
- tomcat 启动参数 Xms, Xmx, XX:MaxNewSize, XX:PermSize, -XX:MaxPermSize, Djava.awt.headless
- 逆波兰表达式的计算问题
- linux图形界面和文本界面的切换操作方法
- 上传项目到JCenter以及Maven仓库的步骤和错误解决
- springmvc(一),简单搭建能使用即可