import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.TypedValue; import android.view.View; public class CustomCircular extends View { private Paint paint; private float radius; private TypedArray a; private Rect rect; private String mText; private int mColor; private float mRadius; private float mTextSize; public CustomCircular(Context context) { this(context, null); } public CustomCircular(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomCircular(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomCircular, defStyleAttr, 0); radius = 40; mText = a.getString(R.styleable.CustomCircular_ztext);//获得文本 mColor = a.getInt(R.styleable.CustomCircular_zcolor, Color.GREEN);//获得颜色 /** * 单位的互换, 其中,第一个参数是你想要得到的单位,第二个参数是你想得到的单位的数值, 比如:我要得到一个20sp, 那么我就用TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 25,getResources().getDisplayMetrics()), 返回的就是25sp对应的px数值了。 */ int px = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); mRadius = a.getDimension(R.styleable.CustomCircular_radius, px);//获取半径 int px1 = (int) TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); mTextSize = a.getDimension(R.styleable.CustomCircular_ztextSzie, px1); a.recycle(); paint = new Paint(); rect = new Rect(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width = 0; int height = 0; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = (int) (4 * radius); } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = (int) (4 * radius); } setMeasuredDimension(width, height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int width = getWidth(); int height = getHeight(); //画一个大圆 paint.setColor(Color.YELLOW); canvas.drawCircle(width / 2, height / 2, radius * 2, paint); //画一个小圆 paint.setColor(Color.WHITE); canvas.drawCircle(width / 2, height / 2, radius, paint); // // String str = "gao"; paint.setTextSize(mTextSize); paint.getTextBounds(mText, 0, mText.length(), rect); /** * 处理字体大小 */ if (rect.width() > radius) { paint.setTextSize(20); paint.getTextBounds(mText, 0, mText.length(), rect); } paint.setColor(Color.BLACK); canvas.drawText(mText, width / 2 - rect.width() / 2, height / 2 + rect.height() / 2, paint); } }
<attr name="ztext" format="string" /> <attr name="ztextSzie" format="dimension" /> <attr name="radius" format="dimension" /> <attr name="zcolor" format="color" /> <declare-styleable name="CustomCircular"> <attr name="ztext" /> <attr name="ztextSzie" /> <attr name="radius" /> <attr name="zcolor" /> </declare-styleable>
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="bwie.day02.MainActivity"> <bwie.day02.CustomCircular android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello World!" app:ztextSzie="20dp" app:ztext="gao" /> </RelativeLayout>
package com.bwie.text; import android.content.Intent; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final MyCircle circle= (MyCircle) findViewById(R.id.circle); circle.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction()==MotionEvent.ACTION_DOWN){\ //得到点击点的坐标 float x = event.getX(); float y = event.getY(); // float x1 = event.getRawX(); // float y1 = event.getRawY(); float radius = circle.getRadius(); //得到相对圆心的 x y的相对距离 float xx = Math.abs(x-radius); float yy = Math.abs(y-radius); //勾股定律 计算点击点到圆心点距离 double disstance = Math.sqrt(xx*xx+yy*yy); //判断 距离小于半径 即在圆内 if(disstance<radius){ startActivity(new Intent(MainActivity.this,SecondActivity.class)); return true; } } return false; } }); } }
相关推荐
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的用户界面。这个“android 自定义view比较综合的例子”显然涵盖了多个高级话题,旨在帮助有一定基础的开发者提升自定义...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。标题“开发自定义View 源码”所指的,是针对如何设计和实现自定义Android View类的...
在Android应用开发中,自定义View视图是一个重要的技术,它允许开发者根据特定需求创建独一无二的用户界面元素。本文将深入探讨如何通过继承View类来实现一个自定义的罗盘界面,以帮助开发者理解自定义视图的工作...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的UI组件。本项目"Android 自定义View实现水平温度计"就是这样一个实例,它通过自定义View来展示一个水平方向的温度计,...
在Android开发中,自定义View是提升应用用户体验和界面独特性的重要手段。本文将深入探讨如何实现自定义View的拖动和点击效果,主要通过两种方法进行讲解:一是使用`setOnTouchListener`并重写`onTouch`方法,二是...
Android 自定义 View 实现转盘旋转的效果 Android 的自定义 View 为开发者定义和使用个性化的 View 提供了很好的支持,想要使用自己定义的 View,需要继承 View 类,并重写构造函数和 onDraw() 函数。onDraw 函数...
本项目旨在教你如何在Android项目中创建一个自定义View,用于实现高斯模糊和毛玻璃效果,并且允许开发者自定义模糊程度。以下是关于这个主题的详细讲解。 一、高斯模糊原理 高斯模糊是一种图像处理技术,通过对图像...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。"Android 自定义View界面大合集"的主题涵盖了这个领域的广泛知识点,包括但不限于...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的界面元素。本示例中,我们关注的是一个自定义View,它能实现背景颜色的渐变效果,而不是常见的进度条渐变。这个自定义View是一...
方便调用,有示例。 Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View。kotlin编写的一个自定义View。
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特的用户界面元素。本主题将深入探讨如何在Android中实现自定义组合控件,即利用多个基础控件构建一个具有特殊功能或样式的复合视图。...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加个性化和高效的设计。本项目中的"自定义View源代码"主要聚焦于一个名为"TopBar"的文件,这通常是应用顶部...
在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...
在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...
本文将深入探讨如何创建一个Android音频剪辑裁剪的自定义View,以便用户可以通过拖动来调整音频的剪切时长,并通过滑块实时显示对应的时间点。 首先,我们需要理解Android的音频处理基础。Android提供了`...
在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创新性的用户界面。自定义View是Android系统框架的一部分,通过扩展系统提供的基本View类或ViewGroup类,我们可以实现自己的绘制逻辑,...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。自定义View通常涉及到绘制、事件处理、动画以及性能优化等多个方面。下面我们将...
自定义View是Android开发中常见的需求,它允许开发者扩展Android系统的内置视图,以满足特定的界面设计或交互需求。创建自定义View通常包括以下步骤: - 创建一个新的Java类,继承自`View`或`ViewGroup`。 - 重写...
在Android开发中,自定义View和自定义Button是提升应用界面独特性和交互体验的重要手段。本Demo主要展示了如何通过自定义View和自定义Button来实现特定的视觉效果和交互功能,比如Button在被点击时变换背景。下面...