Android中TextView和ImageView实现倾斜效果

TextView倾斜:

想做一个倾斜的TextView,想海报上显示的那样 ,在网上找例子一直不能实现,看了看TextView源码,发现很简单,为方便像我一样糊涂的孩纸,贴出来了.

首先需要先自定义一个TextView

public class MyTextView extends TextView{ 

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

  @Override
  protected void onDraw(Canvas canvas) {
    //倾斜度45,上下左右居中
    canvas.rotate(-45, getMeasuredWidth()/2, getMeasuredHeight()/2);
    super.onDraw(canvas);
  } 

}

xml文件中添加上这个MyTextView

<com.peace.test.incline_textview.MyTextView
    android:layout_width="100dip"
    android:layout_height="100dip"
    android:gravity="center"
    android:text="@string/hello_world"/>

ImageView倾斜:

MainActivity如下:

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;
import android.app.Activity;
import android.graphics.Matrix;
/**
 * Demo描述:
 * 利用mImageView.setImageMatrix(matrix)实现
 * 图片的平移,缩放,旋转,倾斜以及对称
 *
 * 参考资料:
 * 0 http://blog.csdn.net/pathuang68/article/details/6991988
 * 1 http://blog.csdn.net/mingli198611/article/details/7830633
 *
 * Thank you very much
 */
public class MainActivity extends Activity {
 private TestMatrixImageView mTestMatrixImageView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  mTestMatrixImageView=new TestMatrixImageView(MainActivity.this);
  mTestMatrixImageView.setScaleType(ImageView.ScaleType.MATRIX);//??
  mTestMatrixImageView.setOnTouchListener(new TouchListenerImpl());
  setContentView(mTestMatrixImageView);
 } 

 private class TouchListenerImpl implements OnTouchListener{
  @Override
  public boolean onTouch(View v, MotionEvent event) {
   if (event.getAction()==MotionEvent.ACTION_UP) {
    //1 测试平移
    testTranslate();
    //2 测试围绕图片中心点旋转
    //testRotate();
    //3 测试围绕原点旋转后平移
    //testRotateAndTranslate();
    //4 缩放
    //testScale();
    //5 水平倾斜
    //testSkewX();
    //6 垂直倾斜
    //testSkewY();
    //7 水平且垂直倾斜
    //testSkewXY();
    //8 水平对称
    //testSymmetryX();
    //9 垂直对称
    //testSymmetryY();
    //10 关于X=Y对称
    //testSymmetryXY();
   }
   return true;
  } 

 } 

 //平移
 private void testTranslate(){
  Matrix matrix=new Matrix();
  int width=mTestMatrixImageView.getBitmap().getWidth();
  int height=mTestMatrixImageView.getBitmap().getHeight();
  matrix.postTranslate(width, height);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 }
 //围绕图片中心点旋转
 private void testRotate(){
  Matrix matrix=new Matrix();
  int width=mTestMatrixImageView.getBitmap().getWidth();
  int height=mTestMatrixImageView.getBitmap().getHeight();
  matrix.postRotate(45f, width/2, height/2);
  matrix.postTranslate(width, height);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 //围绕原点旋转后平移
 //注意以下三行代码的执行顺序:
 //matrix.setRotate(45f);
 //matrix.preTranslate(-width, -height);
 //matrix.postTranslate(width, height);
 //先执行matrix.preTranslate(-width, -height);
 //后执行matrix.setRotate(45f);
 //再执行matrix.postTranslate(width, height);
 private void testRotateAndTranslate() {
  Matrix matrix = new Matrix();
  int width = mTestMatrixImageView.getBitmap().getWidth();
  int height = mTestMatrixImageView.getBitmap().getHeight();
  matrix.setRotate(45f);
  matrix.preTranslate(-width, -height);
  matrix.postTranslate(width, height);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 //缩放
 private void testScale() {
  Matrix matrix = new Matrix();
  matrix.setScale(0.5f, 0.5f);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 //水平倾斜
 private void testSkewX() {
  Matrix matrix = new Matrix();
  matrix.setSkew(0.5f, 0);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 // 垂直倾斜
 private void testSkewY() {
  Matrix matrix = new Matrix();
  matrix.setSkew(0, 0.5f);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 // 水平且垂直倾斜
 private void testSkewXY() {
  Matrix matrix = new Matrix();
  matrix.setSkew(0.5f, 0.5f);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 // 水平对称--图片关于X轴对称
 private void testSymmetryX() {
  Matrix matrix = new Matrix();
  int height = mTestMatrixImageView.getBitmap().getHeight();
  float matrixValues[] = { 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f };
  matrix.setValues(matrixValues);
  //若是matrix.postTranslate(0, height);
  //表示将图片上下倒置
  matrix.postTranslate(0, height*2);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 // 垂直对称--图片关于Y轴对称
 private void testSymmetryY() {
  Matrix matrix = new Matrix();
  int width=mTestMatrixImageView.getBitmap().getWidth();
  float matrixValues[] = {-1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f};
  matrix.setValues(matrixValues);
  //若是matrix.postTranslate(width,0);
  //表示将图片左右倒置
  matrix.postTranslate(width*2, 0);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix); 

 } 

 // 关于X=Y对称--图片关于X=Y轴对称
 private void testSymmetryXY() {
  Matrix matrix = new Matrix();
  int width = mTestMatrixImageView.getBitmap().getWidth();
  int height = mTestMatrixImageView.getBitmap().getHeight();
  float matrixValues[] = { 0f, -1f, 0f, -1f, 0f, 0f, 0f, 0f, 1f };
  matrix.setValues(matrixValues);
  matrix.postTranslate(width+height, width+height);
  mTestMatrixImageView.setImageMatrix(matrix);
  showMatrixEveryValue(matrix);
 } 

 //获取变换矩阵Matrix中的每个值
 private void showMatrixEveryValue(Matrix matrix){
  float matrixValues []=new float[9];
  matrix.getValues(matrixValues);
  for (int i = 0; i <3; i++) {
   String valueString="";
   for (int j = 0; j < 3; j++) {
    valueString=matrixValues[3*i+j]+"";
    System.out.println("第"+(i+1)+"行的第"+(j+1)+"列的值为"+valueString);
   }
  }
 } 

}

TestMatrixImageView如下:

package cn.testmatrix;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.widget.ImageView;
/**
 * 总结:
 * 在MainActivity中执行:
 * mTestMatrixImageView.setImageMatrix(matrix);
 * 时此自定义View会先调用setImageMatrix(Matrix matrix)
 * 然后调用onDraw(Canvas canvas)
 */
public class TestMatrixImageView extends ImageView{
 private Matrix mMatrix;
 private Bitmap mBitmap;
 public TestMatrixImageView(Context context) {
  super(context);
  mMatrix=new Matrix();
  mBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.icon);
 }
 @Override
 protected void onDraw(Canvas canvas) {
  System.out.println("---> onDraw");
  //画原图
  canvas.drawBitmap(mBitmap, 0, 0, null);
  //画经过Matrix变化后的图
  canvas.drawBitmap(mBitmap, mMatrix, null);
  super.onDraw(canvas);
 }
 @Override
 public void setImageMatrix(Matrix matrix) {
  System.out.println("---> setImageMatrix");
  this.mMatrix.set(matrix);
  super.setImageMatrix(matrix);
 } 

 public Bitmap getBitmap(){
  System.out.println("---> getBitmap");
  return mBitmap;
 } 

}

main.xml如下:

<RelativeLayout 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"
 > 

 <TextView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="@string/hello_world" /> 

</RelativeLayout> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android TextView对齐的两种方法

    Android TextView对齐的两种方法 在写Android布局文件时, 经常碰到如下图的TextView左右对齐的情况, 即姓名和手机号码纵向对齐.. 第一种方法:  在姓和名之间加空格, 但是如果用键盘的空格会在一些机型上对齐.一些机型上不对齐. \u3000是全角空格:  \u0020是半角空格,效果跟在英文输入法下直接敲键盘空格一样. 这里要用全角空格,  占位一个汉字. <TextView android:layout_width="wrap_content" a

  • Android TextView 去掉自适应默认的fontpadding的实现方法

    Android TextView 去掉自适应默认的fontpadding的实现方法 最近在项目中使用textview时发现在使用Android:layout_height="wrap_content"这个属性设置后,textview会有默认的padding,也就是fontpadding.这样就会造成textview和其他view中间的间距会比自己的设置的大.那么我们怎么来remove掉这个间距呢?  第一.先试试设置includefontpadding=false ,如果不能达到目的的

  • Android中TextView显示圆圈背景或设置圆角的方法

    前言 在我们学习android这么久,而且使用TextView那么长时间,我们一直没有用过给TextView添加背景,或者是给TextView添加添加边框,以及怎么样设置TextView的形状.今天在写代码的时候就用到了,怎么在java代码部分设置TextView的背景,和TextView的形状及边框. 方法如下: 接下来我们来看一下,怎么在Java代码部分怎么设置TextView的背景颜色,其实很简单的就一句话. tvTemp.setBackgroundColor(Color.parseCol

  • android TextView实现跑马灯效果

    本文实例为大家分享了android TextView跑马灯效果的具体代码,供大家参考,具体内容如下 一.要点 设置四个属性 android:singleLine="true" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" 直接在xml中使用 <TextView android:layout_

  • Android TextView实现带链接文字事件监听的三种常用方式示例

    本文实例讲述了Android TextView实现带链接文字事件监听的三种常用方式.分享给大家供大家参考,具体如下: /** * TextView实现文字链接跳转功能 * @description: * @author ldm * @date 2016-4-21 下午4:34:05 */ public class TextViewLinkAct extends Activity { private TextView tv_3; private TextView tv_4; @Override p

  • Android实现带动画效果的可点击展开TextView

    本文为大家分享了Android实现带动画效果的可点击展开TextView 制作代码,效果图: 收起(默认)效果: 点击展开后的效果: 源码: 布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout android:id="@+id/activity_main" xmlns:android="http://schemas.android.com/apk/res/a

  • Android中TextView和ImageView实现倾斜效果

    TextView倾斜: 想做一个倾斜的TextView,想海报上显示的那样 ,在网上找例子一直不能实现,看了看TextView源码,发现很简单,为方便像我一样糊涂的孩纸,贴出来了. 首先需要先自定义一个TextView public class MyTextView extends TextView{ public MyTextView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protec

  • Android 中TextView的使用imageview被压缩问题解决办法

    Android 中TextView的使用imageview被压缩问题解决办法 看下运行效果图: 今天解bug的时候遇到一个奇怪的问题:listview的item由一个textview和一个imageview组成,父布局是线性水平排列.我的本意是imageview显示相同的图片,textview显示文本,但是运行程序后发现,当某个textview的文本较多时,imageview会被压缩,刚开始没注意,检查代码了好久. 代码示例如下: <!--文本少的item--> <LinearLayou

  • Android中TextView实现垂直滚动和上下滚动效果

    布局里面就是两个自定义的TextView,上面的左右滑动的是AutoHorizontalScrollTextView; 下面上下滚动的是AutoVerticalScrollTextView; 上面左右滑动的非常好实现,直接把AutoHorizontalScrollTextView复制到项目中,复制全类名到布局文件中,和系统TextView一样,只需设置文本其他什么都不用设置: 下面垂直滚动的AutoVerticalScrollTextView相比AutoHorizontalScrollTextV

  • Android中利用viewflipper动画切换屏幕效果

    整个项目的 package com.example.viewflipper; import android.R.integer; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.GestureDetector.OnDoubleTapListener; import android.view.Menu; import android.view.Me

  • Android中使用RecylerView实现聊天框效果

    从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传统的ListView,更加强大和灵活.在上篇文章给大家介绍了Android RecylerView入门教程,大家可以点击查看详情. 效果图如下:(其中,聊天框背景图用9-patch图,可以内容自适应调节.利用AndroidStudio自带的功能制作就行了,图片->右键->create 9-patch file. 其中要注意的是: 1.将9-patch图保存到drawable目录下才管用

  • Android中FlowLayout组件实现瀑布流效果

    目录 FlowLayout实现关键步骤: 1.创建一个view继承自ViewGroup 2.重写并实现onMeasure方法 3.重写并实现onLayout方法 总结 纸上得来终觉浅,绝知此事要躬行. 动手实践是学习的最好的方式,对于自定义View来说,听和看只能是过一遍流程,能掌握个30%.40%就不错了,而且很快就会遗忘,想变成自己的东西必须动手来写几遍,细细体会其中的细节和系统API的奥秘.真谛. 进入主题,今天来手写一个瀑布流组件FlowLayout,温习下自定义view的流程和关键点,

  • Android中TextView自动适配文本大小的几种解决方案

    目录 TextView文本大小自动适配与TextView边距的去除 一.Autosizing的方式(固定宽度) 二.自定义View的方式(固定宽度) 三.使用工具类自行计算(非控件固定宽度) 四.去除TextView的边距 总结 TextView文本大小自动适配与TextView边距的去除 标题太难取了,其实本文主要就是讲如何控制文本大小,让其自动适配宽度,其次我们还需要精准控制Text的高度和宽度间距等属性. 一般我们的布局都是分 match parent 和 wrap content 而他们

  • Android基于TextView实现的跑马灯效果实例

    本文实例讲述了Android基于TextView实现的跑马灯效果.分享给大家供大家参考,具体如下: package sweet.venst.act; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStrea

  • Android中TextView显示插入的图片实现方法

    本文实例讲述了Android中TextView显示插入的图片实现方法.分享给大家供大家参考,具体如下: Android系统默认给TextView插入图片提供了三种方式: 1.ImageSpan 2.Html.ImageGetter 3.TextView.setCompoundDrawables(left, top, right, bottom) 1.TextView使用ImageSpan显示图片 ImageSpan span = new ImageSpan(this, R.drawable.ic

  • Android中button点击后字体的变色效果

    button的点击效果无疑是非常简单的,以致于我懒到当UI告诉我说在点击的时候button字体的颜色也要随着背景改变的时候我毫不犹豫的告诉他让他切两个图过来,后来想想着实是不太靠谱,于是了解了一下如何添加button点击的字体颜色变化效果. 1.首先你要在你的color文件下加入几个你需要的色值,注意不同的是不是一般的color标签,而是drawable标签,就像这样: <drawable name="color_red">#fffa3d39</drawable>

随机推荐