`
hemowolf
  • 浏览: 154091 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

android中角标的实现

阅读更多

    如下图,角标在移动设备中是比较常见的ui元素。各种“最新”、“vip”、“最热”之类的层出不穷。

   

   在展现上最简单的做法是让ui同学ps一张角标图片输入“最新”、“vip”、“最热”等盖在要特别醒目提醒的控件上面即可。当然偷懒是没有一劳永逸的做法的,图片实现带文字的角标在当下android设备如此繁荣的情形下,码工们必然会为千奇百怪的适配而劳碌成大牛的,如果频繁更换图片中的文字ui设计师也会烦滴。
    下文探讨第一种角标的代码实现方式,其他三种还有比较少见的右下角、左下角的角标也可以照着做了。
   把第一种角标直观化卸妆,那么她是这样的
       

   而这个图形我们可以看作是一个小长方形旋转某个角度后,底边两点刚好和大长方形左边和顶边链接叠加所成的直角三角形。

   在android中TextView、LinearLayout是方形的控件。那么,如果我们用TextView替代小长方形、LinearLayout替代大长方形,在TextView靠顶部左对齐的情况下,由下图看到这个几何图形可从A->B->C变换而成。

  

   最终的图形那么是

  

  其中点d坐标即是TextView的位移点,而∠bah则是TextView反方向旋转的角度。

  剩下的就是中学几何计算了。忘了吧!我们复习下要用到的公式:

  sinA=对边/斜边

  cosA=邻边/斜边

  A角度=arcsinA/π*180°

  勾股定理 c^2=a^2+b^2

  好了,这几个公式够我们用了。

 

   根据UI同学的设计图,那么eb、ea两三角边是可以量出来滴(需要注意的是eb不一定=ea)。

通过垂直三角形、长方形的各种垂直、平衡关系

可得∠bah=∠ebf=∠deg=∠gad

ab=√(eb^2+ab^2)

ef=sin(∠ebf)*eb

dg=sin(∠gad)*da=sin(∠ebf)*ef

ga=cos(∠gad)*da=cos(∠ebf)*ef

eg=ea-ga

  到这里就是怎么在代码中对TextView做移动和旋转动作了。由于多次尝试直接对Canvas做移动旋转失败,所以我采用Animation来完成这一系列动作。下面是实现控件的代码。

package com.droidwolf.superscript;

import android.content.Context;
import android.graphics.Matrix;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.TypedValue;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.TextView;

public class SuperscriptView extends TextView {
	private float mDegress,mX,mY;
	private int mHeight,mWidth;
	
	public SuperscriptView(Context context) {
		super(context);
		init(context, null);
	}

	public SuperscriptView(Context context, AttributeSet attrs) {
		super(context, attrs);
		init(context, attrs);
	}

	public SuperscriptView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		init(context, attrs);
	}
	@Override
	public void setVisibility(int visibility) {
		setAnimation(visibility == View.VISIBLE? mAnimation: null);
		super.setVisibility(visibility);
	}

	private void init(Context context, AttributeSet attrs) {
		DisplayMetrics dm = getResources().getDisplayMetrics();
		int topEdge = Math.round(TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 41.333f, dm));
		int  leftEdge= Math.round(TypedValue.applyDimension( TypedValue.COMPLEX_UNIT_DIP, 41.333f, dm));
		calc(leftEdge, topEdge);

		mAnimation.setFillBefore(true);
		mAnimation.setFillAfter(true);
		mAnimation.setFillEnabled(true);
		startAnimation(mAnimation);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		if (mHeight < 1 || mWidth < 1) {
			super.onMeasure(widthMeasureSpec, heightMeasureSpec);
		} else {
			setMeasuredDimension(mWidth, mHeight);
		}
	}

	@Override
	protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
		super.onLayout(changed, left, top, right, bottom);
		int vi= getVisibility();
		setAnimation(null);
		setVisibility(vi);
	}
	
	private void calc(int leftEdge, int topEdge) {
		final double ab = Math.sqrt(Math.pow(topEdge, 2d)+ Math.pow(leftEdge, 2d));
		final double sinB = leftEdge / ab;
		mDegress = -(float) Math.toDegrees(Math.asin(sinB));

		// ef=da=sin(∠ebf)*eb
		mHeight = Math.round((float) (sinB * topEdge));

		// de=sin(∠ead)*ea=sin(∠ebf)*ea
		final double de = sinB * leftEdge;

		// dg=cos(∠ead)*de=cos(∠ebf)*de
		mX = -(float) ((topEdge / ab) * de);

		// eg==sin(∠edg)*de=sin(∠ebf)*de
		mY = (float) (sinB * de);
		mWidth = Math.round((float) ab);
	}

	private Animation mAnimation = new Animation() {
		protected void applyTransformation(float interpolatedTime,Transformation t) {
			if (mHeight < 1 || mWidth < 1) {
				return;
			}
			Matrix tran = t.getMatrix();
			tran.setTranslate(mX, mY);
			tran.postRotate(mDegress, mX, mY);
		}
	};
}

 

   附件是实现的demo。我还实现了第一张图的另外三种角标到一个控件,请移步到我的bitbucket

分享到:
评论

相关推荐

    android 桌面APP图标增加角标功能

    `ShortcutHelper-master`这个压缩包可能包含了一个完整的示例项目,其中包括`ShortcutHelper`类和其他相关文件,用于演示如何在Android应用中实现桌面角标功能。解压后,开发者可以学习和参考其代码结构和实现逻辑,...

    Android-BadgeNumberManager-为你的应用添加桌面角标的Android库

    在Android应用开发中,给应用图标添加角标(Badge Number)是一种常见的通知方式,它能够直观地告诉用户应用中有未读消息或者更新等信息。"Android-BadgeNumberManager"是一个专门为Android开发者设计的库,旨在简化...

    Android ToolBar、TabLayout加角标显示未读消息

    在Android应用开发中,`...通过以上步骤,我们就能够在Android应用中成功地在`ToolBar`和`TabLayout`上实现未读消息的角标显示。在开发过程中,不断优化用户体验,确保角标提示清晰、及时,是提升应用质量的关键。

    Android图片右上角数字角标实现

    通过以上步骤,我们可以轻松地在Android应用中实现图片右上角数字角标的显示。当然,实际项目中可能还需要考虑更多因素,如动画效果、不同屏幕尺寸的适配等。对于复杂的需求,还可以结合使用自定义View和第三方库,...

    Android-Android角标组件效果

    本话题将详细探讨Android中的角标组件及其效果实现。 一、角标组件的作用与设计 角标在UI设计中扮演着重要的角色,它们可以是数字、图标或者简单的形状,用于表示应用内某个部分有未处理的事项。例如,在应用图标...

    Android 通知栏8.0 以及角标数字显示

    在Android 8.0及更高版本中,可以通过`NotificationChannel`的`setShowBadge()`方法来控制应用图标上是否显示角标。如果想让应用在通知栏显示角标数字,需要确保该渠道的`setShowBadge()`被设置为`true`。同时,通过...

    Android例子源码给view加红色数字提醒角标

    在Android应用开发中,给View添加红色数字提醒角标是一种常见的设计手法,它通常用于通知用户有未读消息、更新或者其他重要信息。这种设计元素在许多应用中都可以看到,如通知中心、应用图标或者菜单项。本文将深入...

    用badgeview实现tab的角标

    在设计和实现过程中,需要注意用户体验,确保角标的显示和更新逻辑清晰、准确,同时保持与应用其他部分的协同工作。在实际开发中,可以根据项目需求选择合适的开源库或自定义实现,以达到最佳效果。

    cordova显示角标插件

    在iOS和Android系统中,系统级别的通知管理通常会自动处理角标的显示和更新,但在Cordova应用中,由于是基于Web技术开发,我们需要借助特定的插件来实现这一功能。"cordova-plugin-badge"便是这样一个插件,它提供了...

    极光推送,角标实现,服务器,Android端完整Demo

    本次实现了用户登录注册,将用户保存到Application 里面实现用户...发送消息过后,如果当前用户在线会收到一条任务栏通知,点击通知可以查看到该消息,登录App时 ,APP应用会生成,未读信息角标,(实现了vivo和小米。

    IsBadgeWorking Android 角标提示

    在iOS系统中,角标功能是内建的,但在Android系统中,由于其开放性,各个厂商的实现方式不尽相同,导致角标的统一实现成为一个挑战。IsBadgeWorking库的出现就是为了简化这一过程,使得开发者能够轻松地在各种...

    Android为应用添加数字角标的简单实现

    在iOS系统中,角标功能是系统级别的,而在Android中,由于系统的开放性,开发者需要自行实现这一功能,特别是在非原生启动器中。 实现角标的步骤大致分为以下几步: 1. **添加权限**:在`AndroidManifest.xml`文件...

    Android 实现带角标的ImageView(微博,QQ消息提示)

    本篇将详细介绍如何在Android中实现带角标的ImageView。 首先,角标的绘制过程是通过自定义View来完成的。基本思路是使用Paint对象来测量文字的宽度,并根据文字的长度来决定角标的形状。如果文字只有一个字符,...

    z_消息角标

    在移动应用开发中,iOS可以利用UserNotifications框架,Android则可以使用NotificationCompat库来管理角标显示。在后端,通常需要一个消息推送系统来实时同步用户的未读消息状态。 消息角标的用户体验设计也包括角...

    Android实现倾斜角标样式

    Android 实现倾斜角标样式是 Android 开发中的一种常见需求,特别是在移动支付等应用中。实现倾斜角标样式的关键在于自定义视图的绘制,通过Path和Canvas实现斜角标示的绘制。 知识点1:自定义视图的绘制 在 ...

    底部tabbar 自定义角标

    本篇文章将深入探讨如何在iOS中实现底部TabBar的自定义角标功能。 首先,我们需要了解TabBar的基本概念。TabBar是由`UITabBarController`类管理的,它包含一组`UITabBarItem`,每个Item对应一个导航控制器或视图...

    BadgerView显示角标Demo

    在Android应用开发中,UI设计和用户体验是至关重要的部分,其中一种常见的设计元素就是角标。角标通常用于表示有新的未读消息或更新,比如微信朋友圈中的红色数字提醒。本示例项目“BadgerView显示角标Demo”旨在...

    QQ消息角标显示

    3. Android开发:可以使用ImageView或自定义View,结合Notification或者BroadcastReceiver实现角标显示与更新。 4. JavaFX或Swing:在桌面应用中,可以使用JavaFX的Label或javafx.scene.control.Badge类来实现角标...

    Android实现在图片左上角或右上角显示文字标签.rar

    Android实现在图片左上角或右上角显示文字标签,相信这个功能大家以前肯定见到过,只是不知道如何形容这个功能,本实例还可实现调整标签文字的大孝标签与图片边角的距离、修改标签文字和标签背景颜色、标签宽度和...

Global site tag (gtag.js) - Google Analytics