android自定义View之获取文字高度例子

 更新时间:2016年10月2日 16:23  点击:1766
下面我们来看一篇关于android自定义View之获取文字高度例子,希望这篇文章能够对各位带来帮助。

自定义View经常会画文字,那么就可能需要获取文字的高度,这里介绍一种好用的方法:


public double getTxtHeight(Paint mPaint) {
    Paint.FontMetrics fm = mPaint.getFontMetrics();
    return Math.ceil(fm.descent - fm.ascent);
}

参数为Paint,就是你画文字的画笔,效果如下

device-2016-08-19-150638

canvas.drawText("测试文字", 300, 300, mPaint);
canvas.drawText("文字的高度为:" + getTxtHeight(mPaint) + "px", 300, 400, mPaint);

下面我们就来看一篇关于Android常用跳转工具集合汇总,希望这篇文章能够让各位了解到android中常用跳转工具用法吧。


这里包含了一些基本的并且常用的跳转工具。

这是需要的对应的权限。


<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

代码:

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.MediaStore;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
 
import java.io.File;
 
import frame.zmit.cn.publicutils.R;
 
/**
 * Created by joy on 2016/7/21.
 * 工具集合
 */
public class MainActivity extends AppCompatActivity {
 private String mImagePath;//返回的图片路径
 private final static int REQUEST_CODE_GALLERY = 0x11;
 private final static int REQUEST_CODE_CAMERA = 0x12;
 
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 /**
 * 打开微信
 */
 findViewById(R.id.btn_open_weixin).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = getPackageManager().getLaunchIntentForPackage("com.tencent.mm");
 startActivity(intent);
 }
 });
 /**
 * 跳转到QQ聊天界面
 */
 findViewById(R.id.btn_open_qq).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 String mQqNumber = "98*****08";
 String url11 = "mqqwpa://im/chat?chat_type=wpa&uin=" + mQqNumber + "&version=10";
 startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(url11)));
 }
 });
 /**
 * 跳转到联系人界面
 */
 findViewById(R.id.btn_people_interface).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent();
 intent.setClassName("com.android.contacts", "com.android.contacts.activities.PeopleActivity");
 startActivity(intent);
 }
 });
 /**
 * 跳转到拨号界面
 */
 findViewById(R.id.btn_telephone_interface).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 String phone = "157*****737";
 Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:" + phone));
 intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 startActivity(intent);
 }
 });
 /**
 * 直接拨打电话
 */
 findViewById(R.id.btn_telephone).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 String phone = "157*****737";
 Intent intentPhone = new Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phone));
 startActivity(intentPhone);
 }
 });
 /**
 * 跳转到短信界面
 */
 findViewById(R.id.btn_message_interface).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_VIEW);
 intent.setType("vnd.android-dir/mms-sms");
 startActivity(intent);
 }
 });
 /**
 * 跳转到短信界面
 * 指定号码和短信内容
 */
 findViewById(R.id.btn_message).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 String phone = "157*****737";
 String message = "这是一个自定义的内容";
 Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse("smsto:" + phone));
 intent.putExtra("sms_body", message);
 startActivity(intent);
 }
 });
 /**
 * 跳转到设置界面
 */
 findViewById(R.id.btn_setting_interface).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Settings.ACTION_SETTINGS);
 startActivity(intent);
 }
 });
 /**
 * 跳转到蓝牙界面
 */
 findViewById(R.id.btn_bluetooth_interface).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Settings.ACTION_BLUETOOTH_SETTINGS);
 startActivity(intent);
 }
 });
 /**
 * 调用浏览器
 */
 findViewById(R.id.btn_browser).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent();
 intent.setAction("android.intent.action.VIEW");
 Uri content_url = Uri.parse("http://www.baidu.com");
 intent.setData(content_url);
 startActivity(intent);
 }
 });
 /**
 * 打开照相机
 */
 findViewById(R.id.btn_camera).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 mImagePath = chooseImageFromCamera(MainActivity.this, REQUEST_CODE_CAMERA, "cameraImage");
 }
 });
 /**
 * 打开相册并获取图片地址
 */
 findViewById(R.id.btn_gallery).setOnClickListener(new View.OnClickListener() {
 @Override
 public void onClick(View v) {
 Intent intent = new Intent(Intent.ACTION_PICK, null);
 intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*");
 startActivityForResult(intent, REQUEST_CODE_GALLERY);
 }
 });
 }
 
 public String chooseImageFromCamera(Activity activity, int requestCode, String imageName) {
 Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
 File file = new File(Environment.getExternalStorageDirectory() + "/Images");
 if (!file.exists()) {
 file.mkdirs();
 }
 String savePath = Environment.getExternalStorageDirectory() + "/Images/" + imageName + String.valueOf(System.currentTimeMillis()) + ".jpg";
 Uri mUri = Uri.fromFile(
 new File(savePath));
 cameraIntent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, mUri);
 cameraIntent.putExtra("return-data", true);
 activity.startActivityForResult(cameraIntent, requestCode);
 return savePath;
 }
 
 public String onActivityResultForChooseImageFromGallery(
 Context context, int requestCode, int resultCode, Intent data) {
 String imagePath = null;
 if (data != null) {
 if ("file".equals(data.getData().getScheme())) {
 /** 有些低版本机型返回的Uri模式为file*/
 imagePath = data.getData().getPath();
 } else {
 Uri selectedImage = data.getData();
 String[] filePathColumn = {MediaStore.Images.Media.DATA};
 
 Cursor cursor = context.getContentResolver().query(selectedImage,
 filePathColumn, null, null, null);
 cursor.moveToFirst();
 
 int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
 imagePath = cursor.getString(columnIndex);
 cursor.close();
 }
 return imagePath;
 } else {
 return null;
 }
 
 }
 
 @Override
 protected void onActivityResult(int requestCode, int resultCode, Intent data) {
 super.onActivityResult(requestCode, resultCode, data);
 switch (requestCode) {
 case REQUEST_CODE_GALLERY:
 mImagePath = onActivityResultForChooseImageFromGallery(MainActivity.this,
 requestCode, resultCode, data);
 if (mImagePath != null && mImagePath.length() > 0) {
 Toast.makeText(MainActivity.this, mImagePath, Toast.LENGTH_SHORT).show();
 }
 break;
 case REQUEST_CODE_CAMERA:
 if (mImagePath != null && mImagePath.length() > 0) {
 Toast.makeText(MainActivity.this, mImagePath, Toast.LENGTH_SHORT).show();
 }
 break;
 }
 }
}

下面我们来看一篇关于android开发自定义View实现柱状图的例子,希望这篇文章能够对各位带来帮助,具体的细节步骤如下文介绍。

为了使文章中的代码看起来简洁一点,便于理解一点,我就不把Paint的实例化代码贴出来了,另外提示:本文所有变量都是我定死的,各位可以根据需求来自己设置getset方法.

device-2016-08-19-163253

参数:

private Paint mPaint;//画文字和XY轴的画笔
private Paint mPaintColumn;//画圆柱的画笔
private final float START_X = 200;//Y轴左上角X坐标
private final float START_Y = 200;//Y轴左上角Y坐标
private boolean canLoad = true;//是否开始画图
private float XSpace = 150;//Y轴每个数字间距
private float XWidth = 900;//X轴总长度
private String[] XNames = {"测试1", "测试2", "测试3", "测试4", "测试5"};
private int YCount = 10;//Y轴数值的个数(包括0)
private float YSpace = 100;//Y轴每个数字间距
private float YHeight = 1000;//Y轴总长度
private float ColumsWidth = 50;//长方形宽(圆柱)

YHeight = (float) (YHeight + getTxtHeight(mPaint));//这个代码的意思是:将Y轴的值和文字高度加起来,因为文字有高度,如果
不算文字高度,最后一个Y轴的值就会比计划高一点

//获取文字的高
public double getTxtHeight(Paint mPaint) {
 Paint.FontMetrics fm = mPaint.getFontMetrics();
 return Math.ceil(fm.descent - fm.ascent);
}

关键代码draw:

@Override
public void draw(Canvas canvas) {
    super.draw(canvas);
    if (canLoad) {
        canvas.drawLine(START_X, START_Y, START_X, YHeight + START_Y, mPaint);//Y轴
        canvas.drawLine(START_X, YHeight + START_Y, START_X + XWidth, YHeight + START_Y, mPaint);//X轴
        float MaxTextWidth = mPaint.measureText("1000");//这里我知道最长的字为1000,所以这么写,根据不同情况改
        float TxtHeight = (float) getTxtHeight(mPaint);//mPaint所画文字的高度
        //Y轴上的数值
        for (int i = 0; i <= YCount; i++) {
            String count = 100 * i + "";
            canvas.drawText(count, START_X - MaxTextWidth, YHeight + START_Y - YSpace * i, mPaint);
        }
        //X轴上的数值
        for (int i = 0; i < XNames.length; i++) {
            String name = XNames[i];
            canvas.drawText(name, START_X + XSpace * (i + 1), YHeight + START_Y + TxtHeight, mPaint);
        }
 
        //圆柱和圆柱上面的具体数值
        for (int i = 0; i < XNames.length; i++) {
            String count = (i + 1) * 100 + "";
            canvas.drawRect(START_X + XSpace * (i + 1) - ColumsWidth / 2, START_Y + YHeight - (i + 1) * YSpace, START_X + XSpace * (i + 1) + ColumsWidth / 2, YHeight + START_Y, mPaintColumn);
            canvas.drawText(count, ColumsWidth/2+START_X + XSpace * (i + 1) - ColumsWidth / 2, START_Y + YHeight - (i + 1) * YSpace-10, mPaint);
        }
 
    }
}

下面我们来看一篇关于android开妇这自定义View之使用TextPaint使\n等符号生效的例子,这个是换行符号了,希望此文章对各位有帮助。

同学们现在或以后自定义View画文字的时候,肯定会需要将文字换行,大家都知道\n,那么我们来画试一下:

canvas.drawText("这里是测试换行符\n第二行",300,300,mPaint);

device-2016-08-19-165510

如何解决呢?使用TextPaint:

private TextPaint mPaint;

实例化方式与Paint一致(本来就是Paint的儿子)

接下来:

StaticLayout layout = new StaticLayout("这里是测试换行符\n第二行", mPaint,
(int) mPaint.measureText("这里是测试换行符\n第二行"), Layout.Alignment.ALIGN_NORMAL, 1.0F, 0.0F, true);
canvas.translate(300,300);
layout.draw(canvas);

效果:


device-2016-08-19-165858

 

本文章来为各位介绍一篇关于Android设置WebView的放大倍数例子,希望这篇文章能够帮助到各位朋友,有兴趣的朋友可以进来看看吧。

在APP开发的过程中,不免会遇到加载WebView的情况,一般我们都会固定WebView不能左右滑动但可以上下滑动,有时候界面加载出来之后他的格式跟原网页一模一样,那么就会带来一个问题:整体缩小。真实近视眼的悲哀啊,那么我们就需要放大倍数,但是不能左右滑动,这时候格式就会被灵活的打乱,不影响网页的阅读,这个神奇的属性就是:

webView.setInitialScale(220);

里面的参数是可以自己设置的,你可以根据计算不同手机屏幕的宽度和高度来设置不同的倍数,那么显示效果就会更加兼容了

[!--infotagslink--]

相关文章

  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • Android开发中findViewById()函数用法与简化

    findViewById方法在android开发中是获取页面控件的值了,有没有发现我们一个页面控件多了会反复研究写findViewById呢,下面我们一起来看它的简化方法。 Android中Fin...2016-09-20
  • Android模拟器上模拟来电和短信配置

    如果我们的项目需要做来电及短信的功能,那么我们就得在Android模拟器开发这些功能,本来就来告诉我们如何在Android模拟器上模拟来电及来短信的功能。 在Android模拟...2016-09-20
  • 夜神android模拟器设置代理的方法

    夜神android模拟器如何设置代理呢?对于这个问题其实操作起来是非常的简单,下面小编来为各位详细介绍夜神android模拟器设置代理的方法,希望例子能够帮助到各位。 app...2016-09-20
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android WebView加载html5页面实例教程

    如果我们要在Android应用APP中加载html5页面,我们可以使用WebView,本文我们分享两个WebView加载html5页面实例应用。 实例一:WebView加载html5实现炫酷引导页面大多...2016-09-20
  • 深入理解Android中View和ViewGroup

    深入理解Android中View和ViewGroup从组成架构上看,似乎ViewGroup在View之上,View需要继承ViewGroup,但实际上不是这样的。View是基类,ViewGroup是它的子类。本教程我们深...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • Android用MemoryFile文件类读写进行性能优化

    java开发的Android应用,性能一直是一个大问题,,或许是Java语言本身比较消耗内存。本文我们来谈谈Android 性能优化之MemoryFile文件读写。 Android匿名共享内存对外A...2016-09-20
  • 自定义jquery模态窗口插件无法在顶层窗口显示问题

    自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
  • Android设置TextView竖着显示实例

    TextView默认是横着显示了,今天我们一起来看看Android设置TextView竖着显示如何来实现吧,今天我们就一起来看看操作细节,具体的如下所示。 在开发Android程序的时候,...2016-10-02
  • 自定义feignClient的常见坑及解决

    这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • pytorch 自定义卷积核进行卷积操作方式

    今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • Android 实现钉钉自动打卡功能

    这篇文章主要介绍了Android 实现钉钉自动打卡功能的步骤,帮助大家更好的理解和学习使用Android,感兴趣的朋友可以了解下...2021-03-15
  • Android 开发之布局细节对比:RTL模式

    下面我们来看一篇关于Android 开发之布局细节对比:RTL模式 ,希望这篇文章对各位同学会带来帮助,具体的细节如下介绍。 前言 讲真,好久没写博客了,2016都过了一半了,赶紧...2016-10-02
  • PHP YII框架开发小技巧之模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证...2015-11-24