android 阅读器放大镜_android viewpager点击图片放大_android代码混淆器
阅读更多
就在前三天.我得到了一个让我很很很很很很很震惊的消息.啊啊啊啊啊.就是在我博中最后经常提到的那个刘先生.哎...原来他一直在看我的博客......这个消息够冷门吧.没折.本来想不写了.或再申请个,让谁都找不到的.再一想.没必要么.刘先生也说了.你该写写.我该写也写.哎...他能原谅我.我真的很感谢了.嘿嘿.。圈主微笑的朝阳赵瑛老师是我的朋友,她班学生家长从孩子上一年级就给孩子开通了博客,开始是家长写自己的教子心得,孩子讲述自己的见闻家长记录,然后到孩子自己写。每次嫖娼后android 阅读器放大镜,他用手机拍摄嫖娼时的照片并写嫖娼心得,然后在公司的员工电子阅览室内电脑上,将其发到“佛山大炮”的“吃喝嫖赌”博客网页里。
去年某个时候,我偶然看到一篇文章,讲android里面放大镜的实现。文章很乱,没有格式,基本上属于看不下去的那种。虽然体裁很有意思,但是我也没有足够的内力把它看完。不过看到一句关键的话,说是使用带圆形的Drawable。这句话就够了,他下面写的一堆东西我也懒得看,于是就自己开始尝试,然后就做出来了。现在代码贴出来分享。
package chroya.demo.magnifier; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Shader.TileMode; import android.graphics.drawable.ShapeDrawable; import android.graphics.drawable.shapes.OvalShape; import android.view.MotionEvent; import android.view.View; /** * 放大镜实现方式1 * @author chroya * */ public class ShaderView extends View{ private Bitmap bitmap; private ShapeDrawable drawable; //放大镜的半径 private static final int RADIUS = 80; //放大倍数 private static final int FACTOR = 3; private Matrix matrix = new Matrix(); public ShaderView(Context context) { super(context); Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.show); bitmap = bmp; BitmapShader shader = new BitmapShader( Bitmap.createScaledBitmap(bmp, bmp.getWidth()*FACTOR, bmp.getHeight()*FACTOR, true), TileMode.CLAMP, TileMode.CLAMP); //圆形的drawable drawable = new ShapeDrawable(new OvalShape()); drawable.getPaint().setShader(shader); drawable.setBounds(0, 0, RADIUS*2, RADIUS*2); } @Override public boolean onTouchEvent(MotionEvent event) { final int x = (int) event.getX(); final int y = (int) event.getY(); //这个位置表示的是,画shader的起始位置 matrix.setTranslate(RADIUS-x*FACTOR, RADIUS-y*FACTOR); drawable.getPaint().getShader().setLocalMatrix(matrix); //bounds,就是那个圆的外切矩形 drawable.setBounds(x-RADIUS, y-RADIUS, x+RADIUS, y+RADIUS); invalidate(); return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawBitmap(bitmap, 0, 0, null); drawable.draw(canvas); } }
基本原理就是使用ShapeDrawable构造一个圆形的drawable,然后它的paint的shader设置为将要放大的图片,然后就是简单的位置移动问题了。放大镜的半径和放大倍数都可以在代码里面修改,代码都有注释,应该很好理解了。
不过,一个问题如果只有一种解决方法的话,那未免有点令人沮丧,想玩点另类的都不行。
玩程序就得玩出个性,玩出激情。哈哈,废话太多,切回正题。
再来看看放大镜的另外一种实现吧 ^-^
package chroya.demo.magnifier; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Path; import android.graphics.Path.Direction; import android.view.MotionEvent; import android.view.View; /** * 放大镜实现方式2 * @author chroya * */ public class PathView extends View{ private Path mPath = new Path(); private Matrix matrix = new Matrix(); private Bitmap bitmap; //放大镜的半径 private static final int RADIUS = 80; //放大倍数 private static final int FACTOR = 2; private int mCurrentX, mCurrentY; public PathView(Context context) { super(context); mPath.addCircle(RADIUS, RADIUS, RADIUS, Direction.CW); matrix.setScale(FACTOR, FACTOR); bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.show); } @Override public boolean onTouchEvent(MotionEvent event) { mCurrentX = (int) event.getX(); mCurrentY = (int) event.getY(); invalidate(); return true; } @Override public void onDraw(Canvas canvas) { super.onDraw(canvas); //底图 canvas.drawBitmap(bitmap, 0, 0, null); //剪切 canvas.translate(mCurrentX - RADIUS, mCurrentY - RADIUS); canvas.clipPath(mPath); //画放大后的图 canvas.translate(RADIUS-mCurrentX*FACTOR, RADIUS-mCurrentY*FACTOR); canvas.drawBitmap(bitmap, matrix, null); } }
这里使用的是Path类,将canvas剪切出一块圆形区域,在其上绘制放大的部分。
两种方式的效果都一样,如图:
放大两倍的效果。
放大三倍
貌似还缺点什么,是吧? 嘿嘿,就是放大镜外面缺个框。那玩意,我没资源,所以懒得弄了,有兴趣的自己加吧。
工程见附件。
应用程序动态全屏和退出全屏|Android简单的圆盘形菜单
9 楼老鼠头0072012-02-24
多谢楼主的分享,收益很多,期待你更好的文章,只是,小弟我还有个问题还望楼主有时间指教一下,我用webview实现了网页缩小放大的功能,只是自带的老显示一个放大镜,请问有没有办法让这个放大镜不显示,我用的是多点触摸缩放,不需要这个放大镜
8 楼flyingsir_zw2012-02-22
package chroya.demo.magnifier;
import android.app.Activity;
import android.os.Bundle;
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new ShaderView(this));
// setContentView(new PathView(this));
}
}
ShaderView 当放大镜超出图片范围时,程序会异常退出,没有错误报告.
能简单介绍下运行原理吗?
7 楼琼露露2011-10-26
已读,嘿嘿.
6 楼chroya2011-04-07
a54cc 写道
还记得你看的那篇看不下去的文章么,也想看一下。
去年的事了,而且还是偶然看到的,没有记下地址,sorry了
5 楼a54cc2011-04-07
还记得你看的那篇看不下去的文章么,也想看一下。
4 楼lijiaji_hy2011-03-18
chroya 写道
lijiaji_hy 写道
“貌似还缺点什么,就是放大镜外面缺个框” 你先把它做成针对屏幕放大吧,做到对固定的图片放大没有任何义意,有没有框不是最关键的。
你的意思是放大当前屏幕的内容,不论屏幕上显示的是什么?
记者看到,根据屏幕上出现的江苏省行政区域图,用手指触按相应按钮,不断放大地图,屏幕会显示出所在村庄的卫星照片。据史红哲透露,当前,乐信正研究区块链技术的落地应用,在公司各部门及与合作金融机构之间,搭建一个可共享的“超级账本”。”国家能源局新能源和可再生能源司副调研员透露,下一步最主要是推动技术进步、成本下降,扩大多元化应用,降本增效,充分发挥国家补贴的作用。
3 楼chroya2011-03-07
lijiaji_hy 写道
题外话,有些sf把终极武器替换成150爆7的真仙模型,也有做成时装武器(貌似没精炼特效)的,对血魂焚天真武念念不忘的楼主来说简直不能爱更多啊有木有。安装围笼时,应进行测量定位,用一层导框做成的围笼,一般是先打定位桩,再在定位桩上挂装导框android 阅读器放大镜,导框可在岸边组成,浮运到位以缆索锚碇,在开始插打板桩后,逐步将导框转挂在已打好的板桩上,用有脚手桩的转盘式或旋转式桩架时,导框可挂装在外侧的脚手桩上。f" faem magrnwiith=vdaule>ffamer csorllin=valge>u 规定窗内框示什么htm显文l档命 名窗框或域以区别的便窗可以框指它向 义定框左右窗边缘的白空大,必小须于等大于 1定窗义框下边缘上空白的大小,须大于必于1等设 置窗框是否滚有栏,其值动以可"是es"y,"n",oa"tu"o,缺时一般为省auto""禁止 户调整一个窗框用的大 小于功对能的表单,一般需性运行一个cg要i小序,程hmt仅l仅产生表是的表单面子。
你的意思是放大当前屏幕的内容,不论屏幕上显示的是什么?
2 楼lijiaji_hy2011-03-07
题外话,有些sf把终极武器替换成150爆7的真仙模型,也有做成时装武器(貌似没精炼特效)的,对血魂焚天真武念念不忘的楼主来说简直不能爱更多啊有木有。安装围笼时,应进行测量定位,用一层导框做成的围笼,一般是先打定位桩,再在定位桩上挂装导框,导框可在岸边组成,浮运到位以缆索锚碇,在开始插打板桩后,逐步将导框转挂在已打好的板桩上,用有脚手桩的转盘式或旋转式桩架时,导框可挂装在外侧的脚手桩上。f" faem magrnwiith=vdaule>ffamer csorllin=valge>u 规定窗内框示什么htm显文l档命 名窗框或域以区别的便窗可以框指它向 义定框左右窗边缘的白空大,必小须于等大于 1定窗义框下边缘上空白的大小,须大于必于1等设 置窗框是否滚有栏,其值动以可"是es"y,"n",oa"tu"o,缺时一般为省auto""禁止 户调整一个窗框用的大 小于功对能的表单,一般需性运行一个cg要i小序,程hmt仅l仅产生表是的表单面子。
1 楼ET焖猪仔2011-02-27
永世不变苏音么么哒QAQ让我这种耳力特别好的如何生存QuQ