最近较流行的效果 Android自定义View实现倾斜列表/图片_Android

先看看效果图:

实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果

代码实现:

1、定义属性

在values文件夹下的attrs文件添加以下代码

<resources>
  <declare-styleable name="TiltView">
    <attr name="type" format="integer" />
  </declare-styleable>
</resources>

2、自定义布局

public class TiltView extends ImageView {

  private int imageWidth;//图片宽度
  private int imageHeight;//图片高度
  private double angle = 10 * Math.PI / 180;//三角形角度
  private int triangleHeight;//三角形高度
  private Paint paint;//画笔
  private Path path;//绘制路径
  private int type;//倾斜图片的类型

  public TiltView(Context context) {
    this(context, null);
  }

  public TiltView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public TiltView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.TiltView);
    type = array.getInteger(R.styleable.TiltView_type, 1);
    array.recycle();
  }

  //重测大小
  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    imageWidth = measureSpec(widthMeasureSpec);
    imageHeight = measureSpec(heightMeasureSpec);
    setMeasuredDimension(imageWidth, imageHeight); //设置View的大小
    triangleHeight = (int) (Math.abs(Math.tan(angle) * imageHeight));
  }

  //测量长度
  private int measureSpec(int measureSpec) {
    int minLength = 200;
    int mode = MeasureSpec.getMode(measureSpec);
    int length = MeasureSpec.getSize(measureSpec);

    if (mode == MeasureSpec.AT_MOST) {
      length = Math.min(length, minLength);
    }
    return length;
  }

  @Override
  protected void onDraw(Canvas canvas) {
    initPaint();

    Bitmap mBitmap = Bitmap.createBitmap(imageWidth, imageHeight, Bitmap.Config.ARGB_8888); //初始化Bitmap
    Canvas mCanvas = new Canvas(mBitmap);//创建画布,并绘制mBitmap
    Bitmap mBackBitmap = ((BitmapDrawable) getDrawable()).getBitmap();
    mCanvas.drawBitmap(resizeBitmap(mBackBitmap), 0, 0, null);//绘制Bitmap

    setTriangle();
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
    mCanvas.drawPath(path, paint);

    canvas.drawBitmap(mBitmap, 0, 0, null);
  }

  //初始化画笔
  private void initPaint() {
    paint = new Paint();
    paint.setDither(true);//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱满,图像更加清晰
    paint.setAntiAlias(true);//设置抗锯齿
    paint.setStrokeWidth(5);
    paint.setStyle(Paint.Style.FILL);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeJoin(Paint.Join.ROUND);//圆角
  }

  //设置三角形区域
  private void setTriangle() {
    path = new Path();
    switch (type) {
      case 1://右下角
        path.moveTo(0, imageHeight);
        path.lineTo(imageWidth, imageHeight);
        path.lineTo(imageWidth, imageHeight - triangleHeight);
        path.lineTo(0, imageHeight);
        break;
      case 2://左上角+左下角
        path.moveTo(0, triangleHeight);
        path.lineTo(imageWidth, 0);
        path.lineTo(0, 0);
        path.lineTo(0, imageHeight);
        path.lineTo(imageWidth, imageHeight);
        path.lineTo(0, imageHeight - triangleHeight);
        break;
      case 3://右上角+右下角
        path.moveTo(imageWidth, triangleHeight);
        path.lineTo(0, 0);
        path.lineTo(imageWidth, 0);
        path.lineTo(imageWidth, imageHeight);
        path.lineTo(0, imageHeight);
        path.lineTo(imageWidth, imageHeight - triangleHeight);
        break;
      case 4://右上角
        path.moveTo(0, 0);
        path.lineTo(imageWidth, 0);
        path.lineTo(imageWidth, triangleHeight);
        path.lineTo(0, 0);
        break;
      case 5://左上角
        path.moveTo(0, 0);
        path.lineTo(imageWidth, 0);
        path.lineTo(0, triangleHeight);
        path.lineTo(0, 0);
        break;
    }
  }

  //重新调节图片大小
  private Bitmap resizeBitmap(Bitmap bitmap) {
    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    // 设置想要的大小
    int newWidth = imageWidth;
    int newHeight = imageHeight;
    // 计算缩放比例
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // 取得想要缩放的matrix参数
    Matrix matrix = new Matrix();
    matrix.postScale(scaleWidth, scaleHeight);
    // 得到新的图片
    return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true);
  }

}

3、布局代码调用

//其中android:layout_marginTop="-15dp"对效果实现有很大的作用
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  xmlns:app="http://schemas.android.com/apk/res-auto"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <com.pengkv.may.widget.TiltView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:src="@drawable/sample_0"
    app:type="1" />

  <com.pengkv.may.widget.TiltView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_marginTop="-15dp"
    android:src="@drawable/sample_1"
    app:type="2" />

  <com.pengkv.may.widget.TiltView
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:layout_marginTop="-15dp"
    android:src="@drawable/sample_2"
    app:type="4" />

</LinearLayout>

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, view
, 倾斜列表
倾斜图片
textview 倾斜45度、android textview倾斜、textview倾斜、textview 字体倾斜、ios view倾斜,以便于您获取更多的相关知识。

时间: 2024-09-30 17:16:31

最近较流行的效果 Android自定义View实现倾斜列表/图片_Android的相关文章

最近较流行的效果 Android自定义View实现倾斜列表/图片

先看看效果图: 实现思路:擦除图片相应的角,然后层叠图片,产生倾斜效果 代码实现: 1.定义属性 在values文件夹下的attrs文件添加以下代码 <resources> <declare-styleable name="TiltView"> <attr name="type" format="integer" /> </declare-styleable> </resources>

Android自定义view制作绚丽的验证码_Android

废话不多说了,先给大家展示下自定义view效果图,如果大家觉得还不错的话,请继续往下阅读. 怎么样,这种验证码是不是很常见呢,下面我们就自己动手实现这种效果,自己动手,丰衣足食,哈哈~ 一. 自定义view的步骤 自定义view一直被认为android进阶通向高手的必经之路,其实自定义view好简单,自定义view真正难的是如何绘制出高难度的图形,这需要有好的数学功底(后悔没有好好学数学了~),因为绘制图形经常要计算坐标点及类似的几何变换等等.自定义view通常只需要以下几个步骤: 写一个类继承

Android自定义View实现字母导航栏_Android

很多的Android入门程序猿来说对于Android自定义View,可能都是比较恐惧的,但是这又是高手进阶的必经之路,所有准备在自定义View上面花一些功夫,多写一些文章. 思路分析: 1.自定义View实现字母导航栏 2.ListView实现联系人列表 3.字母导航栏滑动事件处理 4.字母导航栏与中间字母的联动 5.字母导航栏与ListView的联动 效果图: 首先,我们先甩出主布局文件,方便后面代码的说明 <!--?xml version="1.0" encoding=&qu

Android自定义View软键盘实现搜索_Android

1. xml文件中加入自定义 搜索view <com.etoury.etoury.ui.view.IconCenterEditText android:id="@+id/search_et" style="@style/StyleEditText" android:hint="搜索景点信息" /> 2. 自定义的   view java文件 IconCenterEditText.java package com.etoury.etou

Android 自定义View 密码框实例代码_Android

暴露您view中所有影响可见外观的属性或者行为. •通过XML添加和设置样式 •通过元素的属性来控制其外观和行为,支持和重要事件交流的事件监听器 详细步骤见:Android 自定义View步骤 效果图展示: 支持的样式 可以通过XML定义影响外边和行为的属性如下 边框圆角值,边框颜色,分割线颜色,边框宽度,密码长度,密码大小,密码颜色 <declare-styleable name="PasswordInputView"> <attr name="borde

Android自定义View绘制随机生成图片验证码_Android

本篇文章讲的是Android自定义View之随机生成图片验证码,开发中我们会经常需要随机生成图片验证码,但是这个是其次,主要还是想总结一些自定义View的开发过程以及一些需要注意的地方. 按照惯例先看看效果图: 一.先总结下自定义View的步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 3.重写onMesure 4.重写onDraw 其中onMesure方法不一定要重写,但大部分情况下还是需要重写的 二.View 的几个构造函数 1.public CustomV

Android自定义View弧线进度控件_Android

这个是一个以弧线为依托的进度控件,主要包括了两个圆弧.一个圆.一个文本.   当我们点击开始按钮的时候,会出现一个动画,逐渐的出现进度,好了,下面开始我们的编码. 新建一个类,继承自View,实现三个构造方法,接着定义变量,初始化变量的数据.代码如下: private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCirc

Android自定义View实现BMI指数条_Android

最近项目需要,需要做一个BMI指数的指示条,先上效果图: BMI指数从18到35,然后上面指示条的颜色会随着偏移量的变化而改变,数字显示当前的BMI指数,下面的BMI标准也是根据不同数值的范围来判断的.考虑到这个view的特殊性,最后采用的是自定义的view来完成的. 1.页面布局: <LinearLayout android:layout_width="fill_parent" android:layout_height="100dp" android:la

Android自定义View仿QQ健康界面_Android

最近一直在学习自定义View相关的知识,今天给大家带来的是QQ健康界面的实现.先看效果图: 可以设置数字颜色,字体颜色,运动步数,运动排名,运动平均步数,虚线下方的蓝色指示条的长度会随着平均步数改变而进行变化.整体效果还是和QQ运动健康界面很像的. 自定义View四部曲,一起来看看怎么实现的. 1.自定义view的属性: <?xml version="1.0" encoding="utf-8"?> <resources> //自定义属性名,定