实现放大镜效果

来源:互联网 发布:s7-300plc编程实例 编辑:程序博客网 时间:2024/04/30 00:30

1、布局文件

<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:id="@+id/frameLayout1"    android:layout_width="fill_parent"    android:layout_height="fill_parent"    android:orientation="vertical" >   </FrameLayout>

2、在MainActivity中创建MyView的内部类,继承android.view.View类,并添加构造方法和重写onDraw(Canvas canvas)方法,然后在onCreate()方法中获取布局文件中添加的帧布局管理器,并将MyView视图添加到该帧布局管理器中

public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        FrameLayout ll = (FrameLayout)findViewById(R.id.frameLayout1);        ll.addView(new MyView(this));    }    public class MyView extends View{public MyView(Context context) {super(context);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);}    }}


3、在内部类MyView中,定义源图像、放大镜图像、放大镜的半径、放大倍数、放大镜的左边距和顶边距

private Bitmap bitmap;//源图像,也就是背景图像    private ShapeDrawable drawable;    private final int RADIUS = 57 ;//放大镜的半径    private final int FACTOR = 2;//放大倍数    private Matrix matrix = new Matrix();    private Bitmap bitmap_magnifier;//放大镜位图    private int m_left = 0;//放大镜的左边距    private int m_top = 0;//放大镜的顶边距


4、在内部类MyView的构造方法中

Bitmap bitmap_source = BitmapFactory.decodeResource(getResources(),<span style="white-space:pre"></span>R.drawable.source);//获取要显示的源图像<span style="white-space:pre"></span>bitmap = bitmap_source;<span style="white-space:pre"></span>BitmapShader shader = new BitmapShader(Bitmap.createScaledBitmap(<span style="white-space:pre"></span>bitmap_source,bitmap_source.getWidth()*FACTOR, <span style="white-space:pre"></span>bitmap_source.getHeight()*FACTOR, true),TileMode.CLAMP , TileMode.CLAMP);//创建BitmapShader对象<span style="white-space:pre"></span>//圆形的drawable<span style="white-space:pre"></span>drawable = new ShapeDrawable(new OvalShape());<span style="white-space:pre"></span>drawable.getPaint().setShader(shader);<span style="white-space:pre"></span>drawable.setBounds(0, 0, RADIUS*2, RADIUS*2);//设置圆的外切矩形<span style="white-space:pre"></span>bitmap_magnifier = BitmapFactory.decodeResource(getResources(), R.drawable.magnifier);//获取放大镜图像<span style="white-space:pre"></span>m_left = RADIUS - bitmap_magnifier.getWidth()/2;//计算放大镜的默认左边距<span style="white-space:pre"></span>m_top = RADIUS - bitmap_magnifier.getHeight()/2;//计算放大镜的默认右边距

5、在MyView的onDraw()方法中,分别绘制背景图像、放大镜图像和放大后的图像

canvas.drawBitmap(bitmap, 0, 0, null);//绘制背景图像canvas.drawBitmap(bitmap_magnifier, m_left, m_top, null);//绘制放大镜图像drawable.draw(canvas);//绘制放大后的图像

6、在MyView类中,重写onTouchEvent()方法,实现党用户触摸屏幕时,放大触摸点附近的图像

@Override<span style="white-space:pre"></span>public boolean onTouchEvent(MotionEvent event) {<span style="white-space:pre"></span>final int x = (int)event.getX();//获取当前触摸点的X轴左边<span style="white-space:pre"></span>final int y = (int)event.getY();//获取当前触摸点的Y轴左边<span style="white-space:pre"></span>matrix.setTranslate(RADIUS-x*FACTOR, RADIUS-y*FACTOR);//平移到绘制shader的起始位置<span style="white-space:pre"></span>drawable.getPaint().getShader().setLocalMatrix(matrix);<span style="white-space:pre"></span>drawable.setBounds(x-RADIUS, y-RADIUS, x+RADIUS, y+RADIUS);//设置圆的外切距离<span style="white-space:pre"></span>m_left = x-bitmap_magnifier.getWidth()/2;//计算放大镜的左边距<span style="white-space:pre"></span>m_top = y-bitmap_magnifier.getHeight()/2;//计算放大镜的右边距<span style="white-space:pre"></span>invalidate();//重置画布<span style="white-space:pre"></span>return true;<span style="white-space:pre"></span>}





1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机流量把话费扣没了怎么办 街电忘记还怎么办3天了 街电1个星期没还怎么办 苹果手机设置密码忘记问题了怎么办 买房付了首付后无法办按揭怎么办 苹果x导入通讯录不显示名字怎么办 苹果切换了id通讯录没有了怎么办 换了id通讯录记录没有了怎么办 4s升级系统通讯录没了怎么办 手机接听声音小怎么办但插耳机正常 苹果6p手机听筒声音小怎么办 苹果6s接电话对方声音小怎么办 iphone死机了怎么办关机也关不了 苹果7p卡死sos了怎么办 苹果x死机且屏幕失灵怎怎么办 幸果手机开机数字便按不动了怎么办 苹果6s黑屏但没关机怎么办 苹果6p突然黑屏怎么办单冷接电话 华硕86u的5g掉线找不到怎么办 信而富额度被清0怎么办 贷款回访电话回答错两个问题怎么办 天天中彩票获取期号失败怎么办 借贷宝电话打到家里了怎么办 私人借款付了利息不下款怎么办 别人借钱不还打电话不接怎么办 有信电话给别人打电话不接怎么办 别人欠我材料钱不接电话怎么办 别人欠我两千块钱不接电话怎么办 欠下很多钱没法面对父母怎么办 客户货款已打但要求改包装怎么办 微信好友欠钱不还还把我拉黑怎么办 微信朋友欠钱把我拉黑了怎么办 淘宝东西寄回去订单号忘写了怎么办 商家退款后客户不退回商品怎么办 有凭证还了本金不消条怎么办 华为荣耀畅玩7x充电慢怎么办 发现淘宝店盗用了我拍的视频怎么办 淘宝售假只能发布50个宝贝怎么办 在肯德基买的券过期了怎么办 新买的手机实体店不给换怎么办 苹果平板充电时显示不在充电怎么办