package com.example.and6;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.view.Window;public class MainActivity extends  Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(R.layout.activity_main2);final DataTable tab=(DataTable) findViewById(R.id.tab);findViewById(R.id.but).setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubString[][]data=new String[(int) (Math.random()*5+5)][ (int) (Math.random()*3+1) ];for (int i = 0; i < data.length; i++) for (int j = 0; j < data[i].length; j++) data[i][j]=Math.pow(i+j, 5)+"";data[0][0]="安卓Draw123";tab.setData(data);}});} }

package com.example.and6;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;import android.widget.FrameLayout.LayoutParams;public class DataTable extends View {public DataTable(Context context  ) {super(context);// TODO Auto-generated constructor stubinit();}public DataTable(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinit();}public DataTable(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stubinit();}@SuppressLint("NewApi")public DataTable(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);// TODO Auto-generated constructor stubinit();}private Paint paint;private String[][] data;private int textPadding=10;private void init() {// TODO Auto-generated method stubpaint=new Paint();paint.setColor(Color.BLACK);paint.setStyle(Style.FILL);paint.setAntiAlias(true); }public void setData(String[][]data) {this.data=data;Rect rect=new Rect();paint.getTextBounds("A测量", 0, 1, rect);getLayoutParams().height=(rect.height()+ textPadding*2 )*data.length+getPaddingTop()+getPaddingBottom();//设置布局参数后会自动调用onMeasure 和 onDrawsetLayoutParams(getLayoutParams()); }@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { System.out.println("measure  widthMeasureSpec= "+MeasureSpec.getSize(widthMeasureSpec) +" "+MeasureSpec.getMode(widthMeasureSpec));System.out.println("measure  heightMeasureSpec= "+MeasureSpec.getSize(heightMeasureSpec) +" "+MeasureSpec.getMode(heightMeasureSpec));if (data==null) {//一开始宽高设置为0 heightMeasureSpec=MeasureSpec.makeMeasureSpec(  0, MeasureSpec.EXACTLY); widthMeasureSpec=MeasureSpec.makeMeasureSpec(0, MeasureSpec.EXACTLY);}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);if (data==null) {return;}//表格大小int w=getWidth()-getPaddingLeft()-getPaddingRight();int h=getHeight()-getPaddingTop()-getPaddingBottom();float cellW=w*1.0f/data[0].length;//每一个单元格大小float cellH=h*1.0f/data.length;System.out.println("draw h="+h+ "  cellH="+cellH);canvas.translate(getPaddingLeft(), getPaddingTop());//移动到指定位置for (int i = 0; i <=data.length; i++) {canvas.drawLine(0, i*cellH, w, i*cellH, paint);}for (int i = 0; i <=data[0].length; i++) {canvas.drawLine(i*cellW, 0, i*cellW, h, paint);}for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {//计算字体大小Rect rect=new Rect();paint.getTextBounds(data[i][j], 0, data[i][j].length(), rect);float offsetX=(cellW-rect.width())/2;float offsetY= textPadding+rect.height();//绘制字符串时 已字符串左下角为原点,向右为正,向上为正canvas.drawText(data[i][j],j*cellW+offsetX , i*cellH+offsetY, paint);}} }}

package com.example.and6;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.Paint.Style;import android.graphics.Rect;import android.util.AttributeSet;import android.view.View;public class MyView extends View {public MyView(Context context  ) {super(context);// TODO Auto-generated constructor stubinit();}public MyView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stubinit();}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);// TODO Auto-generated constructor stubinit();}@SuppressLint("NewApi")public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);// TODO Auto-generated constructor stubinit();}private Paint paint;private void init() {// TODO Auto-generated method stubpaint=new Paint();paint.setColor(Color.BLACK);paint.setStyle(Style.STROKE);paint.setAntiAlias(true);}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);paint.setStyle(Style.STROKE);canvas.translate(getWidth()/2, getHeight()/2);canvas.drawCircle(0, 0, getWidth()/2-getPaddingBottom(), paint);paint.setStyle(Style.FILL);int strheight = 0;for (int i = 1; i < 13; i++) {//每次旋转30度,旋转的是画布,坐标没有旋转canvas.rotate(360/12);canvas.drawLine(0, -getWidth()/2+getPaddingBottom(), 0, -getWidth()/2+getPaddingBottom()+10, paint);String txt=i+"";Rect rect = new Rect();//返回包围整个字符串的最小的一个Rect区域paint.getTextBounds(txt, 0, txt.length(), rect);int strwidth = rect.width(); strheight = rect.height();//float w=paint.measureText(txt);canvas.drawText(txt, 0-strwidth/2, -getWidth()/2+strheight+10+getPaddingBottom(), paint);canvas.drawCircle(0, 0, 2, paint);}canvas.drawLine(0, 0, getWidth()/2-getPaddingBottom()-strheight-20, -50, paint);canvas.drawLine(0, 0, -( getWidth()/2-getPaddingBottom()-strheight-40), - getWidth()/6 , paint);}}

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent" >    <LinearLayout        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:background="#fff"        android:orientation="vertical" >        <Button            android:id="@+id/but"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@string/hello_world" />        <LinearLayout            android:layout_width="match_parent"            android:layout_height="wrap_content"            android:orientation="horizontal" >            <Button                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="xxx" />            <com.example.and6.DataTable                android:id="@+id/tab"                android:layout_width="match_parent"                android:layout_height="wrap_content"                android:background="#aaa"                android:padding="10dp" />            <Button                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="mmm" />        </LinearLayout>        <com.example.and6.MyView            android:layout_width="250dp"            android:layout_height="350dp"            android:layout_centerInParent="true"            android:background="#aaa"            android:padding="15dp" />    </LinearLayout></ScrollView>


更多相关文章

  1. android 指南针
  2. Android(安卓)ProgressBar的动画效果
  3. Android(安卓)利用Matrix实现图片随手指平移、旋转、缩放
  4. 【转】Android(安卓)字符串的加密和解密
  5. Android实现图片缩放与旋转
  6. Android(安卓)获取本地音乐文件
  7. Android(安卓)中的 R.class,减小 Apk 包大小
  8. Android(安卓)改变AlertDialog的大小
  9. 修改android桌面图标默认大小

随机推荐

  1. Android有四大组件
  2. Android(安卓)怎么样使用shape
  3. 如何修改Android系统默认时间
  4. Android Studio 插件--SelectorChapek
  5. 什么是APK文件
  6. Android Jetpack :Navigation 学习笔记
  7. 一篇文章看明白 Android 图形系统 Surfac
  8. android:configChanges属性在不同版本SDK
  9. Android GPU Inspector
  10. Android访问Tomcat错误以及mp3player项目