`
zhengaihua
  • 浏览: 21686 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

自定义view

 
阅读更多
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是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。标题“开发自定义View 源码”所指的,是针对如何设计和实现自定义Android View类的...

    Android 自定义View视图

    在Android应用开发中,自定义View视图是一个重要的技术,它允许开发者根据特定需求创建独一无二的用户界面元素。本文将深入探讨如何通过继承View类来实现一个自定义的罗盘界面,以帮助开发者理解自定义视图的工作...

    Android 自定义View实现水平温度计

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且功能丰富的UI组件。本项目"Android 自定义View实现水平温度计"就是这样一个实例,它通过自定义View来展示一个水平方向的温度计,...

    实现自定义view拖动、点击效果

    在Android开发中,自定义View是提升应用用户体验和界面独特性的重要手段。本文将深入探讨如何实现自定义View的拖动和点击效果,主要通过两种方法进行讲解:一是使用`setOnTouchListener`并重写`onTouch`方法,二是...

    Android自定义View实现转盘旋转的效果

    Android 自定义 View 实现转盘旋转的效果 Android 的自定义 View 为开发者定义和使用个性化的 View 提供了很好的支持,想要使用自己定义的 View,需要继承 View 类,并重写构造函数和 onDraw() 函数。onDraw 函数...

    android项目下对图片高斯模糊毛玻璃自定义view

    本项目旨在教你如何在Android项目中创建一个自定义View,用于实现高斯模糊和毛玻璃效果,并且允许开发者自定义模糊程度。以下是关于这个主题的详细讲解。 一、高斯模糊原理 高斯模糊是一种图像处理技术,通过对图像...

    android 自定义View界面大合集

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。"Android 自定义View界面大合集"的主题涵盖了这个领域的广泛知识点,包括但不限于...

    Android自定义View实例:深度剖析 水晶/水滴 波浪球 实现步骤详解

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的UI元素,提升用户体验。本文将深度剖析如何实现一个名为“水晶/水滴 波浪球”的自定义View,并通过详细步骤讲解,帮助你掌握...

    android 自定义view 背景渐变色 代码可运行

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有表现力的界面元素。本示例中,我们关注的是一个自定义View,它能实现背景颜色的渐变效果,而不是常见的进度条渐变。这个自定义View是一...

    Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View

    方便调用,有示例。 Android自定义View图片裁剪,支持自由裁剪、按自定义比例裁剪、圆形裁剪、旋转、镜面翻转,从0到1自定义View。kotlin编写的一个自定义View。

    Android自定义view——组合控件

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特的用户界面元素。本主题将深入探讨如何在Android中实现自定义组合控件,即利用多个基础控件构建一个具有特殊功能或样式的复合视图。...

    自定义View源代码

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加个性化和高效的设计。本项目中的"自定义View源代码"主要聚焦于一个名为"TopBar"的文件,这通常是应用顶部...

    android开发随声音大小变化的自定义view

    在Android开发中,创建一个能够随声音大小变化的自定义View是一种常见的需求,尤其是在音乐播放器或者音频相关的应用中。这个自定义View可以是长方形或圆柱形,旨在模仿音频波形或音量指示器的效果。下面我们将深入...

    android 自定义view及自定义属性

    在Android开发中,自定义View和自定义属性是提升应用个性化和功能扩展性的重要手段。本文将深入探讨这两个核心概念,以及如何在实际项目中应用它们。 ### 自定义View 自定义View允许开发者创建自己的视图组件,以...

    Android音频剪辑裁剪自定义view

    本文将深入探讨如何创建一个Android音频剪辑裁剪的自定义View,以便用户可以通过拖动来调整音频的剪切时长,并通过滑块实时显示对应的时间点。 首先,我们需要理解Android的音频处理基础。Android提供了`...

    自定义View的学习使用

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创新性的用户界面。自定义View是Android系统框架的一部分,通过扩展系统提供的基本View类或ViewGroup类,我们可以实现自己的绘制逻辑,...

    Android中自定义View

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素,以实现更加丰富和个性化的交互体验。自定义View通常涉及到绘制、事件处理、动画以及性能优化等多个方面。下面我们将...

    android demo,自定义控件view,点击该自定义view,onclick随机生成数字

    自定义View是Android开发中常见的需求,它允许开发者扩展Android系统的内置视图,以满足特定的界面设计或交互需求。创建自定义View通常包括以下步骤: - 创建一个新的Java类,继承自`View`或`ViewGroup`。 - 重写...

    android自定义view自定义buttonDemo

    在Android开发中,自定义View和自定义Button是提升应用界面独特性和交互体验的重要手段。本Demo主要展示了如何通过自定义View和自定义Button来实现特定的视觉效果和交互功能,比如Button在被点击时变换背景。下面...

Global site tag (gtag.js) - Google Analytics