- 浏览: 5826989 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (890)
- WindowsPhone (0)
- android (88)
- android快速迭代 (17)
- android基础 (34)
- android进阶 (172)
- android高级 (0)
- android拾遗 (85)
- android动画&效果 (68)
- Material Design (13)
- LUA (5)
- j2me (32)
- jQuery (39)
- spring (26)
- hibernate (20)
- struts (26)
- tomcat (9)
- javascript+css+html (62)
- jsp+servlet+javabean (14)
- java (37)
- velocity+FCKeditor (13)
- linux+批处理 (9)
- mysql (19)
- MyEclipse (9)
- ajax (7)
- wap (8)
- j2ee+apache (24)
- 其他 (13)
- phonegap (35)
最新评论
-
Memories_NC:
本地lua脚本终于执行成功了,虽然不是通过redis
java中调用lua脚本语言1 -
ZHOU452840622:
大神://处理返回的接收状态 这个好像没有监听到 遇 ...
android 发送短信的两种方式 -
PXY:
拦截部分地址,怎么写的for(int i=0;i<lis ...
判断是否登录的拦截器SessionFilter -
maotou1988:
Android控件之带清空按钮(功能)的AutoComplet ...
自定义AutoCompleteTextView -
yangmaolinpl:
希望有表例子更好。。。,不过也看明白了。
浅谈onInterceptTouchEvent、onTouchEvent与onTouch
提供对视图的对角线切割,具有很好的用户定制
基本用法:
所有属性:
也可以通过代码设置:
一共有三个类,只供学习用:
github:
https://github.com/IntruderShanky/Squint
基本用法:
<com.intrusoft.squint.DiagonalView android:id="@+id/diagonal" android:layout_width="match_parent" android:layout_height="240dp" android:scaleType="centerCrop" android:src="@drawable/c1" squint:diagonalDirection="bottom_to_top" squint:angle="12" squint:gravity="right" />
所有属性:
<?xml version="1.0" encoding="utf-8"?> <resources> <attr name="src" format="reference" /> <attr name="angle" format="integer" /> <attr name="scaleType"> <enum name="centerCrop" value="0" /> <enum name="fitXY" value="1" /> </attr> <attr name="gravity"> <enum name="left" value="0" /> <enum name="right" value="1" /> <enum name="top" value="2" /> <enum name="bottom" value="3" /> </attr> <attr name="diagonalDirection"> <enum name="left_to_right" value="0" /> <enum name="right_to_left" value="1" /> <enum name="top_to_bottom" value="2" /> <enum name="bottom_to_top" value="3" /> </attr> <attr name="tint" format="color" /> <attr name="solidColor" format="color" /> <attr name="fillColor" format="color" /> <declare-styleable name="DiagonalView"> <attr name="angle" /> <attr name="gravity" /> <attr name="tint" /> <attr name="solidColor" /> <attr name="fillColor" /> <attr name="diagonalDirection" /> </declare-styleable> </resources>
也可以通过代码设置:
DiagonalView diagonalView = (DiagonalView) findViewById(R.id.diagonal); // to set image from resources diagonalView.setImageSource(R.drawable.your_image); // to set bitmap diagonalView.setBitmap(bitmap); // to set the diagonal angle diagonalView.setAngle(15); // to set the diagonal gravity diagonalView.setGravity(DiagonalView.Gravity.LEFT); // to set the background color (color should have some alpha val) diagonalView.setColorTint(Color.GREEN); // to make the solid color diagonal diagonalView.setSolidColor(Color.BLUE);
一共有三个类,只供学习用:
import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.Path; import android.graphics.Shader; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.net.Uri; import android.util.AttributeSet; import android.widget.ImageView; import com.intrusoft.squint.Squint.Direction; import com.intrusoft.squint.Squint.Gravity; import static android.graphics.Paint.ANTI_ALIAS_FLAG; import static com.intrusoft.squint.Squint.DIRECTIONS; import static com.intrusoft.squint.Squint.GRAVITIES; public class DiagonalView extends ImageView { private final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; private final Paint fillPaint = new Paint(ANTI_ALIAS_FLAG); private final Paint tintPaint = new Paint(ANTI_ALIAS_FLAG); private final Paint bitmapPaint = new Paint(ANTI_ALIAS_FLAG); private final Paint solidPaint = new Paint(ANTI_ALIAS_FLAG); private final Matrix shaderMatrix = new Matrix(); private final int DEFAULT_ALPHA = 50; private static int tintColor = Color.TRANSPARENT; private static int fillColor = Color.TRANSPARENT; private static int solidColor = Color.TRANSPARENT; private float width; private float height; private int angle = 10; private Gravity gravity = Gravity.BOTTOM; private Direction direction = Direction.LEFT_TO_RIGHT; private Bitmap bitmap; private BitmapShader bitmapShader; private ColorFilter colorFilter; public DiagonalView(Context context) { super(context); init(context, null, 0); } public DiagonalView(Context context, AttributeSet attrs) { super(context, attrs); init(context, attrs, 0); } public DiagonalView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context, attrs, defStyleAttr); } private void init(Context context, AttributeSet attributeSet, int defStyleAttr) { if (attributeSet != null) { TypedArray array = context.obtainStyledAttributes(attributeSet, R.styleable.DiagonalView, defStyleAttr, 0); angle = array.getInt(R.styleable.DiagonalView_angle, angle); gravity = GRAVITIES[array.getInt(R.styleable.DiagonalView_gravity, 3)]; tintColor = array.getColor(R.styleable.DiagonalView_tint, Color.TRANSPARENT); fillColor = array.getColor(R.styleable.DiagonalView_fillColor, Color.TRANSPARENT); solidColor = array.getColor(R.styleable.DiagonalView_solidColor, Color.TRANSPARENT); direction = DIRECTIONS[array.getInt(R.styleable.DiagonalView_diagonalDirection, 0)]; array.recycle(); } fillPaint.setStyle(Paint.Style.FILL); fillPaint.setColor(fillColor); tintPaint.setStyle(Paint.Style.FILL); tintPaint.setColor(tintColor); solidPaint.setStyle(Paint.Style.FILL); solidPaint.setColor(solidColor); solidPaint.setAlpha(255); if (tintPaint.getAlpha() == 255) tintPaint.setAlpha(DEFAULT_ALPHA); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); initializeBitmap(); } @Override public void draw(Canvas canvas) { Path path = PathHelper.getPathFor(getWidth(), getHeight(), angle, direction, gravity); if (bitmap != null) { if (fillColor != Color.TRANSPARENT) canvas.drawPath(path, fillPaint); canvas.drawPath(path, bitmapPaint); if (tintColor != Color.TRANSPARENT) canvas.drawPath(path, tintPaint); } if (solidColor != Color.TRANSPARENT) canvas.drawPath(path, solidPaint); } private void initializeBitmap() { width = getMeasuredWidth(); height = getMeasuredHeight(); Drawable drawable = getDrawable(); if (drawable != null) { if (drawable instanceof BitmapDrawable) bitmap = ((BitmapDrawable) drawable).getBitmap(); else { try { int COLOR_DRAWABLE_DIMENSIONS = 2; if (drawable instanceof ColorDrawable) bitmap = Bitmap.createBitmap(COLOR_DRAWABLE_DIMENSIONS, COLOR_DRAWABLE_DIMENSIONS, BITMAP_CONFIG); else bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), BITMAP_CONFIG); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); } catch (Exception e) { e.printStackTrace(); } } if (bitmap == null) { invalidate(); return; } if (bitmapPaint != null) { bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); bitmapPaint.setShader(bitmapShader); } if (this.getScaleType() != ScaleType.CENTER_CROP && this.getScaleType() != ScaleType.FIT_XY) this.setScaleType(ScaleType.CENTER_CROP); setUpScaleType(); applyColorFilter(); invalidate(); } } private void applyColorFilter() { if (bitmapPaint != null) { bitmapPaint.setColorFilter(colorFilter); } } private void setUpScaleType() { float scaleX = 1, scaleY = 1, dx = 0, dy = 0; if (bitmap == null || shaderMatrix == null) return; shaderMatrix.set(null); if (getScaleType() == ScaleType.CENTER_CROP) { if (width != bitmap.getWidth()) { scaleX = width / bitmap.getWidth(); } if (scaleX * bitmap.getHeight() < height) { scaleX = height / bitmap.getHeight(); } dy = (height - bitmap.getHeight() * scaleX) * 0.5f; dx = (width - bitmap.getWidth() * scaleX) * 0.5f; shaderMatrix.setScale(scaleX, scaleX); } else { scaleX = width / bitmap.getWidth(); scaleY = height / bitmap.getHeight(); dy = (height - bitmap.getHeight() * scaleY) * 0.5f; dx = (width - bitmap.getWidth() * scaleX) * 0.5f; shaderMatrix.setScale(scaleX, scaleY); } shaderMatrix.postTranslate(dx + 0.5f, dy + 0.5f); bitmapShader.setLocalMatrix(shaderMatrix); } @Override public void setColorFilter(ColorFilter colorFilter) { if (colorFilter == this.colorFilter) { return; } this.colorFilter = colorFilter; applyColorFilter(); invalidate(); } @Override public ColorFilter getColorFilter() { return colorFilter; } @Override public void setScaleType(ScaleType scaleType) { if (scaleType == ScaleType.CENTER_CROP || scaleType == ScaleType.FIT_XY) super.setScaleType(scaleType); else throw new IllegalArgumentException(String.format("ScaleType %s not supported.", scaleType)); } @Override public void setAdjustViewBounds(boolean adjustViewBounds) { if (adjustViewBounds) { throw new IllegalArgumentException("adjustViewBounds not supported."); } } @Override public void setImageResource(int resId) { super.setImageResource(resId); initializeBitmap(); } @Override public void setImageURI(Uri uri) { super.setImageURI(uri); initializeBitmap(); } @Override public void setImageDrawable(Drawable drawable) { super.setImageDrawable(drawable); initializeBitmap(); } @Override public void setImageBitmap(Bitmap bm) { super.setImageBitmap(bm); initializeBitmap(); } public int getTintColor() { return tintColor; } public void setTintColor(int tintColor) { DiagonalView.tintColor = tintColor; tintPaint.setColor(tintColor); if (tintPaint.getAlpha() == 255) tintPaint.setAlpha(DEFAULT_ALPHA); invalidate(); } public int getFillColor() { return fillColor; } public void setFillColor(int fillColor) { DiagonalView.fillColor = fillColor; fillPaint.setColor(fillColor); invalidate(); } public int getSolidColor() { return solidColor; } public void setSolidColor(int solidColor) { DiagonalView.solidColor = solidColor; solidPaint.setColor(solidColor); solidPaint.setAlpha(255); invalidate(); } public void setDiagonalGravity(Gravity gravity) { this.gravity = gravity; invalidate(); } public void setDiagonalDirection(Direction direction) { this.direction = direction; invalidate(); } public void setAngle(int angle) { this.angle = angle; invalidate(); } public void setBitmap(Bitmap bitmap) { this.bitmap = bitmap; invalidate(); } }
import android.graphics.Path; import com.intrusoft.squint.Squint.Direction; import com.intrusoft.squint.Squint.Gravity; import static com.intrusoft.squint.Squint.Gravity.BOTTOM; import static com.intrusoft.squint.Squint.Gravity.LEFT; import static com.intrusoft.squint.Squint.Gravity.RIGHT; import static com.intrusoft.squint.Squint.Gravity.TOP; public class PathHelper { public static Path getPathFor(float width, float height, double angle, Direction direction, Gravity gravity) { switch (direction) { case LEFT_TO_RIGHT: return leftToRight(width, height, angle, gravity); case RIGHT_TO_LEFT: return rightToLeft(width, height, angle, gravity); case TOP_TO_BOTTOM: return topToBottom(width, height, angle, gravity); case BOTTOM_TO_TOP: return bottomToTop(width, height, angle, gravity); } return null; } private static Path leftToRight(float width, float height, double angle, Gravity gravity) { if (gravity == LEFT || gravity == RIGHT) gravity = BOTTOM; Path path = new Path(); float attitude = (float) Math.abs(Math.tan(Math.toRadians(angle)) * width); if (gravity == BOTTOM) { path.moveTo(0, 0); path.lineTo(width, 0); path.lineTo(width, height - attitude); path.lineTo(0, height); path.close(); } else { path.moveTo(0, 0); path.lineTo(width, attitude); path.lineTo(width, height); path.lineTo(0, height); path.close(); } return path; } private static Path rightToLeft(float width, float height, double angle, Gravity gravity) { if (gravity == LEFT || gravity == RIGHT) gravity = BOTTOM; Path path = new Path(); float attitude = (float) Math.abs(Math.tan(Math.toRadians(angle)) * width); if (gravity == BOTTOM) { path.moveTo(0, 0); path.lineTo(width, 0); path.lineTo(width, height); path.lineTo(0, height - attitude); path.close(); } else { path.moveTo(0, attitude); path.lineTo(width, 0); path.lineTo(width, height); path.lineTo(0, height); path.close(); } return path; } private static Path topToBottom(float width, float height, double angle, Gravity gravity) { if (gravity == TOP || gravity == BOTTOM) gravity = LEFT; float attitude = (float) Math.abs(Math.tan(Math.toRadians(angle)) * height); Path path = new Path(); if (gravity == LEFT) { path.moveTo(0, 0); path.lineTo(0, height); path.lineTo(width - attitude, height); path.lineTo(width, 0); path.close(); } else { path.moveTo(0, 0); path.lineTo(attitude, height); path.lineTo(width, height); path.lineTo(width, 0); path.close(); } return path; } private static Path bottomToTop(float width, float height, double angle, Gravity gravity) { if (gravity == TOP || gravity == BOTTOM) gravity = LEFT; float attitude = (float) Math.abs(Math.tan(Math.toRadians(angle)) * height); Path path = new Path(); if (gravity == LEFT) { path.moveTo(0, 0); path.lineTo(0, height); path.lineTo(width, height); path.lineTo(width - attitude, 0); path.close(); } else { path.moveTo(attitude, 0); path.lineTo(width, 0); path.lineTo(width, height); path.lineTo(0, height); path.close(); } return path; } }
public class Squint { public enum Gravity { LEFT(0), RIGHT(1), TOP(2), BOTTOM(3); final int value; Gravity(int value) { this.value = value; } } static final Gravity[] GRAVITIES = {Gravity.LEFT, Gravity.RIGHT, Gravity.TOP, Gravity.BOTTOM}; public enum Direction { LEFT_TO_RIGHT(0), RIGHT_TO_LEFT(1), TOP_TO_BOTTOM(2), BOTTOM_TO_TOP(3); final int value; Direction(int value) { this.value = value; } } static final Direction[] DIRECTIONS = {Direction.LEFT_TO_RIGHT, Direction.RIGHT_TO_LEFT, Direction.TOP_TO_BOTTOM, Direction.BOTTOM_TO_TOP}; }
github:
https://github.com/IntruderShanky/Squint
发表评论
-
NestedScrollView滚动到顶部固定子View悬停挂靠粘在顶端
2018-10-31 20:45 7016网上有一个StickyScrollView,称之为粘性Scro ... -
自定义Behavior实现AppBarLayout越界弹性效果
2017-03-31 09:33 10387一、继承AppBarLayout.Beha ... -
Android - 一种相似图片搜索算法的实现
2017-03-31 09:33 2633算法 缩小尺寸。 将图片缩小到8x8的尺寸,总共64个 ... -
使用SpringAnimation实现带下拉弹簧动画的 ScrollView
2017-03-30 11:30 2860在刚推出的 Support Library 25.3.0 里面 ... -
Android为应用添加角标(Badge)
2017-03-30 11:21 61971.需求简介 角标是什么意思呢? 看下图即可明了: 可 ... -
Android端与笔记本利用局域网进行FTP通信
2017-03-23 10:17 991先看图 打开前: 打开后: Activity类 ... -
PorterDuffColorFilter 在项目中的基本使用
2017-03-03 10:58 1361有时候标题栏会浮在内容之上,而内容会有颜色的变化,这时候就要求 ... -
ColorAnimationView 实现了滑动Viewpager 时背景色动态变化的过渡效果
2017-02-24 09:41 2233用法在注释中: import android.anima ... -
迷你轻量级全方向完美滑动处理侧滑控件SlideLayout
2017-01-16 16:53 2602纯手工超级迷你轻量级全方向完美滑动处理侧滑控件(比官方 sup ... -
Effect
2017-01-05 09:57 0https://github.com/JetradarMobi ... -
动态主题库Colorful,容易地改变App的配色方案
2016-12-27 14:49 2573Colorful是一个动态主题库,允许您很容易地改变App的配 ... -
仿淘宝京东拖拽商品详情页上下滚动黏滞效果
2016-12-26 16:53 3506比较常用的效果,有现成的,如此甚好!:) import ... -
让任意view具有滑动效果的SlideUp
2016-12-26 09:26 1713基本的类,只有一个: import android.a ... -
AdvancedWebView
2016-12-21 09:44 16https://github.com/delight-im/A ... -
可设置圆角背景边框的按钮, 通过调节色彩明度自动计算按下(pressed)状态颜色
2016-11-02 22:13 1935可设置圆角背景边框的的按钮, 通过调节色彩明度自动计算按下(p ... -
网络请求库相关
2016-10-09 09:35 62https://github.com/amitshekhari ... -
ASimpleCache一个简单的缓存框架
2015-10-26 22:53 2186ASimpleCache 是一个为android制定的 轻量级 ... -
使用ViewDragHelper实现的DragLayout开门效果
2015-10-23 10:55 3427先看一下图,有个直观的了解,向下拖动handle就“开门了”: ... -
保证图片长宽比的同时拉伸图片ImageView
2015-10-16 15:40 3743按比例放大图片,不拉伸失真 import android. ... -
向上拖动时,可以惯性滑动显示到下一页的控件DragLayout
2015-10-16 14:53 5589仿照淘宝和聚美优品,在商品详情页,向上拖动时,可以加载下一页。 ...
相关推荐
在Android开发中,图片的加载和展示是用户体验的重要组成部分,而`Diagonalify`是一个独特的库,它允许开发者创建对角线切割效果的图片视图,为应用界面增添了一种新颖、独特的视觉风格。这个库主要用于自定义图像...
例如,在立方体中,每个面都有对角线,而穿过立方体中心的对角线被称为体对角线。通过可视化模型,学生可以直观看到不同几何体的对角线形状和长度,有助于理解对角线的概念和计算方法。 3. 高线:高线是从几何体的...
本项目结合这两者,实现了一个功能,即通过视图切割来查看零部件的内部结构,这对于机械设计、医疗图像分析等领域有着广泛的应用价值。 首先,我们来看`zxInsideViewWidget.cpp`,这是实现视图切割功能的主要代码...
4. 处理用户对分割线的拖动事件,动态调整子视图的大小。 总的来说,"MFC单文档视图切割"是一个强大的功能,可以让用户在同一文档界面下享受多种视图体验。通过理解和熟练掌握MFC中的相关类和方法,开发者可以创建...
MFC给我们做好了一个多视图的框架。但在应用中,MFC默认的视图并不能满足我们的要求。本Demo中包含以下做界面的常用代码: 自定义视图: 在CWinApp::Initlnstance里定义CMultiDocTemplate 视图窗口分割: 在...
本教程将详细讲解如何利用MFC的单文档接口(Single Document Interface, SDI)实现视图的切割,将一个单文档切割成多个视图,分别使用CListView和CFormView类。 首先,让我们理解什么是SDI。SDI是一种用户界面模式...
然而,有时我们可能希望在同一个SDI应用中展示不同类型的视图,比如文本视图、图像视图或者图表视图。这种需求可以通过在MFC中实现多视图来解决。下面将详细解释如何在MFC的单文档视图中进行多种视图的切换。 首先...
体切片(Volume Slicing)是体绘制的一种变体,它通过沿特定方向切割数据体来显示其内部结构。vtk可以使用vtkPlaneSource或者vtkImageSlice来创建切片,然后结合vtkSliceMapper和vtkActor进行渲染。用户可以自由调整...
在本课程件中,我们探讨的是“动态n棱柱直观图、视图及截交线”的概念,这是几何学和三维空间理解中的重要主题。GeoGebra是一款强大的数学软件工具,它允许用户创建动态数学模型,使学习过程更加生动有趣。 首先,...
7. **四边形的性质**:在正方体中,过对角线的平面切割产生的四边形可能具有不同的性质,如菱形、梯形等。问题7考察了这些性质及其在底面投影的形状。 8. **组合几何体**:问题8让学生根据正视图和侧视图估算几何体...
通过视图可以实现对数据的安全访问控制。 - **动态视图**:相比于静态视图,动态视图更加灵活,它可以实时反映基础表的变化,当基础表的数据发生变化时,动态视图也会随之更新。 #### 操作步骤详解 下面我们将按照...
### 计算机视觉中的多视图几何 ...通过对本中文版的学习,读者可以建立起对多视图几何基本概念的理解,并为进一步深入学习打下坚实的基础。随着技术的进步,未来多视图几何将在更多领域发挥重要作用。
然而,根据你提供的标题和描述,有人对`fullCalendar`进行了扩展,添加了年视图功能。年视图允许用户以年度为单位查看和管理事件,这对于那些需要查看整个年度计划或者安排长期项目的人来说非常有用。年视图的增加让...
在VC++编程环境中,视图...总的来说,这个"view_fenge.rar_VC 视图"的资源对学习和提升VC++视图操作及界面设计能力非常有价值,它提供了一种实践性的学习方法,让开发者能够通过实际代码来理解和掌握视图切割的技巧。
这个模型包括了四个主要的视图:逻辑视图、进程视图、物理视图和开发视图,以及一个附加的用例视图,这五个部分共同构建了一个全面的软件体系结构描述。 1. **逻辑视图**:这是从功能性的角度来看待软件系统,主要...
"截交线"是在立体几何中,当一个平面切割几何体时,与几何体表面的交线即为截交线。在n棱柱的例子中,可以调整截平面的位置和角度,观察截交线如何随截平面的变化而变化。这种动态演示有助于学生理解截交线的形成...
为了确保子视图的形状也符合圆角布局,我们需要在自定义布局中对子视图进行裁剪。这可以通过调用`clipPath()`或`clipRect()`方法实现,确保裁剪区域与圆角形状一致。 5. **处理边框** 如果需要添加边框,可以在...
本文将通过对机械制图组合体视图PPT教案的解析,详细介绍组合体的概念、形体分析法、组合形式、截交线等相关知识点。 组合体的概念 组合体是由两个或两个以上的基本几何体构成的物体。画、看组合体的视图时,通常...