Android单张图片查看、单指移动、双指缩放、双击最大化或最小化

Android 实现单指滑动、双指缩放照片 Android实现放大缩小 阅读详情
转:http://blog.youkuaiyun.com/huyiyang2010/article/details/18712997转: 

Android单张图片查看、单指移动、双指缩放、双击最大化或最小化

标签: android图片移动imageviewbitmap
  4308人阅读  评论(6)  收藏  举报
  分类:

Android平台上查看单张图片时,通常情况下需要实现图片查看、单指移动、双指缩放、双击最大化或最小化功能。

目前网络上的实现方式,都没有将此功能封装为类,零落在类和xml文件中,代码难以阅读,功能难以复用。

为此,我专门写了一个类做此功能。此类唯一的缺点是没有实现回弹动画。不说废话了,上代码。

代码如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. package com.example.test;  
  2.   
  3. import android.content.Context;  
  4. import android.graphics.Bitmap;  
  5. import android.graphics.Canvas;  
  6. import android.graphics.Matrix;  
  7. import android.graphics.PointF;  
  8. import android.graphics.drawable.BitmapDrawable;  
  9. import android.util.AttributeSet;  
  10. import android.util.FloatMath;  
  11. import android.util.Log;  
  12. import android.view.MotionEvent;  
  13. import android.widget.ImageView;  
  14.   
  15. public class TouchImageView extends ImageView {  
  16.   
  17.     private PointF down = new PointF();  
  18.     private PointF mid = new PointF();  
  19.     <pre code_snippet_id="168679" snippet_file_name="blog_20140123_1_7635608" name="code" class="java"><pre code_snippet_id="168679" snippet_file_name="blog_20140123_1_7635608" name="code" class="java">  private float oldDist = 1f;  
  20.     private Matrix matrix = new Matrix();  
  21.     private Matrix preMatrix = new Matrix();  
  22.     private Matrix savedMatrix = new Matrix();  
  23.   
  24.     private static final int NONE = 0;  
  25.     private static final int DRAG = 1;  
  26.     private static final int ZOOM = 2;  
  27.     private int mode = NONE;  
  28.   
  29.     private boolean isBig = false;  
  30.   
  31.     private int widthScreen;  
  32.     private int heightScreen;  
  33.   
  34.     private int touchImgWidth;  
  35.     private int touchImgHeight;  
  36.   
  37.     private float defaultScale;  
  38.   
  39.     private long lastClickTime = 0;  
  40.   
  41.     private Bitmap touchImg = null;  
  42.   
  43.     private static final int DOUBLE_CLICK_TIME_SPACE = 300;  
  44.     private static final int DOUBLE_POINT_DISTANCE = 10;  
  45.     private static float MAX_SCALE = 3.0f;  
  46.   
  47.     public TouchImageView(Context context) {  
  48.         super(context);  
  49.     }  
  50.   
  51.     public TouchImageView(Context context, AttributeSet attrs) {  
  52.         super(context, attrs);  
  53.     }  
  54.   
  55.     public TouchImageView(Context context, AttributeSet attrs, int defStyleAttr) {  
  56.         super(context, attrs, defStyleAttr);  
  57.     }  
  58.   
  59.     public void initImageView(int screenWidth, int screenHeight) {  
  60.         widthScreen = screenWidth;  
  61.         heightScreen = screenHeight;  
  62.   
  63.         touchImg = ((BitmapDrawable) getDrawable()).getBitmap();  
  64.         touchImgWidth = touchImg.getWidth();  
  65.         touchImgHeight = touchImg.getHeight();  
  66.         float scaleX = (float) widthScreen / touchImgWidth;  
  67.         float scaleY = (float) heightScreen / touchImgHeight;  
  68.         defaultScale = scaleX < scaleY ? scaleX : scaleY;  
  69.   
  70.         float subX = (widthScreen - touchImgWidth * defaultScale) / 2;  
  71.         float subY = (heightScreen - touchImgHeight * defaultScale) / 2;  
  72.         setScaleType(ScaleType.MATRIX);  
  73.         preMatrix.reset();  
  74.         preMatrix.postScale(defaultScale, defaultScale);  
  75.         preMatrix.postTranslate(subX, subY);  
  76.         matrix.set(preMatrix);  
  77.         invalidate();  
  78.     }  
  79.   
  80.     @Override  
  81.     protected void onDraw(Canvas canvas) {  
  82.         if (null != touchImg) {  
  83.             canvas.save();  
  84.             canvas.drawBitmap(touchImg, matrix, null);  
  85.             canvas.restore();  
  86.         }  
  87.     }  
  88.   
  89.     @Override  
  90.     public boolean onTouchEvent(MotionEvent event) {  
  91.         switch (event.getAction() & MotionEvent.ACTION_MASK) {  
  92.         case MotionEvent.ACTION_DOWN:  
  93.             mode = DRAG;  
  94.             down.x = event.getX();  
  95.             down.y = event.getY();  
  96.             savedMatrix.set(matrix);  
  97.   
  98.             if (event.getEventTime() - lastClickTime < DOUBLE_CLICK_TIME_SPACE) {  
  99.                 changeSize(event.getX(), event.getY());  
  100.             }  
  101.             lastClickTime = event.getEventTime();  
  102.             break;  
  103.         case MotionEvent.ACTION_POINTER_DOWN:  
  104.             oldDist = spacing(event);  
  105.             if (oldDist > DOUBLE_POINT_DISTANCE) {  
  106.                 mode = ZOOM;  
  107.                 // oldRotation = rotation(event);  
  108.                 savedMatrix.set(matrix);  
  109.                 midPoint(mid, event);  
  110.             }  
  111.             break;  
  112.         case MotionEvent.ACTION_MOVE:  
  113.             if (mode == ZOOM) {  
  114.                 float newDist = spacing(event);  
  115.                 float scale = newDist / oldDist;  
  116.                 if (scale > 1.01 || scale < 0.99) {  
  117.                     preMatrix.set(savedMatrix);  
  118.                     preMatrix.postScale(scale, scale, mid.x, mid.y);// 缩放  
  119.                     if (canZoom()) {  
  120.                         matrix.set(preMatrix);  
  121.                         invalidate();  
  122.                     }  
  123.                 }  
  124.             } else if (mode == DRAG) {  
  125.                 if (1.0f < distance(event, down)) {  
  126.                     preMatrix.set(savedMatrix);  
  127.   
  128.                     preMatrix.postTranslate(event.getX() - down.x, 0);  
  129.                     if (event.getX() > down.x) {  
  130.                         if (canDrag(DRAG_RIGHT)) {  
  131.                             savedMatrix.set(preMatrix);  
  132.                         } else {  
  133.                             preMatrix.set(savedMatrix);  
  134.                         }  
  135.                     } else {  
  136.                         if (canDrag(DRAG_LEFT)) {  
  137.                             savedMatrix.set(preMatrix);  
  138.                         } else {  
  139.                             preMatrix.set(savedMatrix);  
  140.                         }  
  141.                     }  
  142.                     preMatrix.postTranslate(0, event.getY() - down.y);  
  143.                     if (event.getY() > down.y) {  
  144.                         if (canDrag(DRAG_DOWN)) {  
  145.                             savedMatrix.set(preMatrix);  
  146.                         } else {  
  147.                             preMatrix.set(savedMatrix);  
  148.                         }  
  149.                     } else {  
  150.                         if (canDrag(DRAG_TOP)) {  
  151.                             savedMatrix.set(preMatrix);  
  152.                         } else {  
  153.                             preMatrix.set(savedMatrix);  
  154.                         }  
  155.                     }  
  156.   
  157.                     matrix.set(preMatrix);  
  158.                     invalidate();  
  159.                     down.x = event.getX();  
  160.                     down.y = event.getY();  
  161.                     savedMatrix.set(matrix);  
  162.                 }  
  163.             }  
  164.             break;  
  165.         case MotionEvent.ACTION_UP:  
  166.             mode = NONE;  
  167.             springback();  
  168.             break;  
  169.         case MotionEvent.ACTION_POINTER_UP:  
  170.             mode = NONE;  
  171.             break;  
  172.         }  
  173.         return true;  
  174.     }  
  175.   
  176.     private void springback() {  
  177.         preMatrix.set(matrix);  
  178.         float[] x = new float[4];  
  179.         float[] y = new float[4];  
  180.         getFourPoint(x, y);  
  181.         if (x[1] - x[0] > widthScreen) {  
  182.             if (x[0] > 0) {  
  183.                 preMatrix.postTranslate(-x[0], 0);  
  184.                 matrix.set(preMatrix);  
  185.                 invalidate();  
  186.             } else if (x[1] < widthScreen) {  
  187.                 preMatrix.postTranslate(widthScreen - x[1], 0);  
  188.                 matrix.set(preMatrix);  
  189.                 invalidate();  
  190.             }  
  191.         } else if (x[1] - x[0] < widthScreen - 1f) {  
  192.             preMatrix.postTranslate((widthScreen - (x[1] - x[0])) / 2 - x[0], 0);  
  193.             matrix.set(preMatrix);  
  194.             invalidate();  
  195.         }  
  196.   
  197.         if (y[2] - y[0] > heightScreen) {  
  198.             if (y[0] > 0) {  
  199.                 preMatrix.postTranslate(0, -y[0]);  
  200.                 matrix.set(preMatrix);  
  201.                 invalidate();  
  202.             } else if (y[2] < heightScreen) {  
  203.                 preMatrix.postTranslate(0, heightScreen - y[2]);  
  204.                 matrix.set(preMatrix);  
  205.                 invalidate();  
  206.             }  
  207.         } else if (y[2] - y[0] < heightScreen - 1f) {  
  208.             preMatrix.postTranslate(0, (heightScreen - (y[2] - y[0])) / 2  
  209.                     - y[0]);  
  210.             matrix.set(preMatrix);  
  211.             invalidate();  
  212.         }  
  213.     }  
  214.   
  215.     private void getFourPoint(float[] x, float[] y) {  
  216.         float[] f = new float[9];  
  217.         preMatrix.getValues(f);  
  218.         // 图片4个顶点的坐标  
  219.         x[0] = f[Matrix.MSCALE_X] * 0 + f[Matrix.MSKEW_X] * 0  
  220.                 + f[Matrix.MTRANS_X];  
  221.         y[0] = f[Matrix.MSKEW_Y] * 0 + f[Matrix.MSCALE_Y] * 0  
  222.                 + f[Matrix.MTRANS_Y];  
  223.         x[1] = f[Matrix.MSCALE_X] * touchImg.getWidth() + f[Matrix.MSKEW_X] * 0  
  224.                 + f[Matrix.MTRANS_X];  
  225.         y[1] = f[Matrix.MSKEW_Y] * touchImg.getWidth() + f[Matrix.MSCALE_Y] * 0  
  226.                 + f[Matrix.MTRANS_Y];  
  227.         x[2] = f[Matrix.MSCALE_X] * 0 + f[Matrix.MSKEW_X]  
  228.                 * touchImg.getHeight() + f[Matrix.MTRANS_X];  
  229.         y[2] = f[Matrix.MSKEW_Y] * 0 + f[Matrix.MSCALE_Y]  
  230.                 * touchImg.getHeight() + f[Matrix.MTRANS_Y];  
  231.         x[3] = f[Matrix.MSCALE_X] * touchImg.getWidth() + f[Matrix.MSKEW_X]  
  232.                 * touchImg.getHeight() + f[Matrix.MTRANS_X];  
  233.         y[3] = f[Matrix.MSKEW_Y] * touchImg.getWidth() + f[Matrix.MSCALE_Y]  
  234.                 * touchImg.getHeight() + f[Matrix.MTRANS_Y];  
  235.     }  
  236.   
  237.     private final static int DRAG_LEFT = 0;  
  238.     private final static int DRAG_RIGHT = 1;  
  239.     private final static int DRAG_TOP = 2;  
  240.     private final static int DRAG_DOWN = 3;  
  241.   
  242.     private boolean canDrag(final int direction) {  
  243.         float[] x = new float[4];  
  244.         float[] y = new float[4];  
  245.         getFourPoint(x, y);  
  246.   
  247.         // 出界判断  
  248.         if ((x[0] > 0 || x[2] > 0 || x[1] < widthScreen || x[3] < widthScreen)  
  249.                 && (y[0] > 0 || y[1] > 0 || y[2] < heightScreen || y[3] < heightScreen)) {  
  250.             return false;  
  251.         }  
  252.         if (DRAG_LEFT == direction) {  
  253.             // 左移出界判断  
  254.             if (x[1] < widthScreen || x[3] < widthScreen) {  
  255.                 return false;  
  256.             }  
  257.         } else if (DRAG_RIGHT == direction) {  
  258.             // 右移出界判断  
  259.             if (x[0] > 0 || x[2] > 0) {  
  260.                 return false;  
  261.             }  
  262.         } else if (DRAG_TOP == direction) {  
  263.             // 上移出界判断  
  264.             if (y[2] < heightScreen || y[3] < heightScreen) {  
  265.                 return false;  
  266.             }  
  267.         } else if (DRAG_DOWN == direction) {  
  268.             // 下移出界判断  
  269.             if (y[0] > 0 || y[1] > 0) {  
  270.                 return false;  
  271.             }  
  272.         } else {  
  273.             return false;  
  274.         }  
  275.         return true;  
  276.     }  
  277.   
  278.     private boolean canZoom() {  
  279.         float[] x = new float[4];  
  280.         float[] y = new float[4];  
  281.         getFourPoint(x, y);  
  282.         // 图片现宽度  
  283.         double width = Math.sqrt((x[0] - x[1]) * (x[0] - x[1]) + (y[0] - y[1])  
  284.                 * (y[0] - y[1]));  
  285.         double height = Math.sqrt((x[0] - x[2]) * (x[0] - x[2]) + (y[0] - y[2])  
  286.                 * (y[0] - y[2]));  
  287.         // 缩放比率判断  
  288.         if (width < touchImgWidth * defaultScale - 1  
  289.                 || width > touchImgWidth * MAX_SCALE + 1) {  
  290.             return false;  
  291.         }  
  292.   
  293.         // 出界判断  
  294.         if (width < widthScreen && height < heightScreen) {  
  295.             return false;  
  296.         }  
  297.         return true;  
  298.     }  
  299.   
  300.     // 触碰两点间距离  
  301.     private static float spacing(MotionEvent event) {  
  302.         float x = event.getX(0) - event.getX(1);  
  303.         if (x < 0) {  
  304.             x = -x;  
  305.         }  
  306.         float y = event.getY(0) - event.getY(1);  
  307.         if (y < 0) {  
  308.             y = -y;  
  309.         }  
  310.         return FloatMath.sqrt(x * x + y * y);  
  311.     }  
  312.   
  313.     // 取手势中心点  
  314.     private static void midPoint(PointF point, MotionEvent event) {  
  315.         float x = event.getX(0) + event.getX(1);  
  316.         float y = event.getY(0) + event.getY(1);  
  317.         point.set(x / 2, y / 2);  
  318.     }  
  319.   
  320.     // 取两点之间的距离  
  321.     private static float distance(MotionEvent point2, PointF point1) {  
  322.         float x = point1.x - point2.getX();  
  323.         if (x < 0) {  
  324.             x = -x;  
  325.         }  
  326.         float y = point1.y - point2.getY();  
  327.         if (y < 0) {  
  328.             y = -y;  
  329.         }  
  330.         return FloatMath.sqrt(x * x + y * y);  
  331.     }  
  332.   
  333.     private void changeSize(float x, float y) {  
  334.         if (isBig) {  
  335.             float subX = (widthScreen - touchImgWidth * defaultScale) / 2;  
  336.             float subY = (heightScreen - touchImgHeight * defaultScale) / 2;  
  337.             preMatrix.reset();  
  338.             preMatrix.postScale(defaultScale, defaultScale);  
  339.             preMatrix.postTranslate(subX, subY);  
  340.             matrix.set(preMatrix);  
  341.             invalidate();  
  342.   
  343.             isBig = false;  
  344.         } else {  
  345.             float transX = (widthScreen - touchImgWidth * MAX_SCALE) / 2;  
  346.             float transY = (heightScreen - touchImgHeight * MAX_SCALE) / 2;  
  347.             preMatrix.reset();  
  348.             preMatrix.postScale(MAX_SCALE, MAX_SCALE);  
  349.             preMatrix.postTranslate(transX, transY);  
  350.             matrix.set(preMatrix);  
  351.             invalidate();  
  352.   
  353.             isBig = true;  
  354.         }  
  355.     }  
  356. }  
  357. </pre>  
  358. <pre></pre>  
  359. <pre></pre>  
  360. <p></p>  
  361. <pre></pre>  
  362. <pre></pre>  
  363. <p><br>  
  364. </p>  
  365. <p><br>  
  366. </p>  
  367. <p></p>  
  368. <p>测试代码如下:</p>  
  369. <p><br>  
  370. </p>  
  371. <p>activity_main.xml文件:</p>  
  372. <p></p>  
  373. <pre code_snippet_id="168679" snippet_file_name="blog_20140123_2_8257273" name="code" class="html"><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  374.     xmlns:tools="http://schemas.android.com/tools"  
  375.     android:id="@+id/layout_id"  
  376.     android:layout_width="match_parent"  
  377.     android:layout_height="match_parent"  
  378.     tools:context=".MainActivity" >  
  379.   
  380.     <com.example.test.TouchImageView  
  381.         android:id="@+id/img_id"  
  382.         android:layout_width="400dip"  
  383.         android:layout_height="800dip"  
  384.         android:src="@drawable/banner"  
  385.         android:scaleType="fitCenter" />  
  386.   
  387. </LinearLayout>  
  388. </pre><br>  
  389. <p><br>  
  390. </p>  
  391. <p>MainActivity.java文件:</p>  
  392. <p></p>  
  393. <p></p>  
  394. <pre code_snippet_id="168679" snippet_file_name="blog_20140123_3_2367928" name="code" class="java">package com.example.test;  
  395.   
  396. import android.app.Activity;  
  397. import android.os.Bundle;  
  398. import android.util.DisplayMetrics;  
  399. import android.view.Menu;  
  400. import android.view.ViewTreeObserver.OnGlobalLayoutListener;  
  401. import android.widget.LinearLayout;  
  402.   
  403. public class MainActivity extends Activity {  
  404.   
  405.     private TouchImageView imgView;  
  406.   
  407.     @Override  
  408.     protected void onCreate(Bundle savedInstanceState) {  
  409.         super.onCreate(savedInstanceState);  
  410.         setContentView(R.layout.activity_main);  
  411.   
  412.         DisplayMetrics dm = new DisplayMetrics();  
  413.         getWindowManager().getDefaultDisplay().getMetrics(dm);  
  414.   
  415.         TouchImageView imgView = (TouchImageView) findViewById(R.id.img_id);  
  416.         imgView.initImageView(dm.widthPixels, dm.heightPixels - 80);  
  417.     }  
  418.   
  419.     @Override  
  420.     public boolean onCreateOptionsMenu(Menu menu) {  
  421.         // Inflate the menu; this adds items to the action bar if it is present.  
  422.         getMenuInflater().inflate(R.menu.main, menu);  
  423.         return true;  
  424.     }  
  425.   
  426. }  
  427. </pre><br>  
  428. <br>  
  429. <p></p>  
  430.      
  431. </pre>  
Android 图片单指滑动双指缩放功能 在上述代码中,我们首先获取ImageView的实例,并创建GestureDetector和ScaleGestureDetector的实例。在上述布局文件中,我们使用了一个ImageView来显示图片,并将其scaleType属性设置为"matrix",以便我们可以手动控制图片的缩放和平移。需要注意的是,为了让ImageView正确响应手势事件,我们需要在布局文件中将ImageView的clickable属性设置为true。首先,我们需要创建一个包含图片的ImageView,并在布局文件中添加相应的代码。 阅读详情

相关推荐

android图片预览缩放

android图片预览缩放

Android手势控制---双指缩放和单指移动

前言 作为一个非科班程序员在Android行业已经摸爬滚打5年多了,一直待在小公司,自我感觉能力应该在中上甚至可以达到初高的水平了.前段时间的一次面试彻底给我打回了原形.面试官当时问我觉得自己对那块最熟悉,然后讲解一下.当时脑袋突然就一片空白,这些年大部分时间都是在独立开发,所有的东西都有涉及,但是没有哪块是自己真正深入了解的.反思自己的经历,所有的东西似乎都还停留在会用阶段.向下深入发现自己基础不够牢靠.重新深入学习Android和我个人规划又不相符,所以只能将日后的遇到的问题在此记录下来,主要记录思路,

qq_28051795的博客 3815

android缩略图点击后预览大图

大图预览 功能描述:一般我们浏览一个应用,别人发布的状态或新闻都会有很多配图, 我们点击图片时可以浏览大图,这张大图一般可以放大,放大到超过屏幕后 * 可以移动 需要从activity的Intent传参数过来 传入参数:url 大图下载地址 smallPath 缩略图存在本地的地址

Android Studio 一个简单的涂鸦APP,实现缩放、移动、涂鸦、保存

Android Studio 一个简单地涂鸦APP,实现缩放、移动、涂鸦、保存

Shopping_Sloth的博客 2774

edp 千1.docx

edp 千1.docx

Android项目控件以及双指放大缩小图片、单指拖动图片.rar

Android项目控件以及双指放大缩小图片、单指拖动图片.rar

Android 手势识别 双指双击 双指缩放 单指双击

public class MainActivity extends AppCompatActivity implements View.OnTouchListener { private ViewGroup gestureListenerGroup; private GestureDetector gestureDetector; @Override protected void onCreate(Bundle savedInstanceState) { .

积跬步 至千里 3812

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型

AI落地困局与破局者FDE:从技术神话到价值实干的战略转型 当前AI企业级应用面临三大核心挑战:业务场景深度非标化、技术落地"最后一公里"困局、以及市场竞争焦点转向实用价值。前线部署工程师(FDE)作为破局关键,通过技术-业务-产品三维交汇的复合能力,将AI从实验室推向生产环境。FDE不仅是技术架构师,更是业务价值挖掘机和产品进化传感器,通过"碎石路-高速公路"双循环模式,将定制化需求沉淀为可复用的平台能力。这种模式颠覆了传统SaaS的销售逻辑,形成基于价值的J型增长

随笔记录-分享&记忆 4013

Android控件双指缩放及双指拖动

Android图片双指缩放及双指拖动

laogan6的博客 2554

HR效率翻倍!用Dify+飞书AI表格打造自动化简历处理流水线(附完整代码)

本文详细介绍了如何利用Dify工作流和飞书多维表格构建自动化简历处理系统,实现简历上传、AI智能解析与结构化数据入库的全流程自动化。通过整合大语言模型进行信息抽取,该系统能显著提升HR处理简历的效率与准确性,将HR从重复劳动中解放出来。

1a2s3d4f5g的博客 1028

每天一个优秀提示词学习收藏 - 文本去AI化(四)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本去AI化Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2447

Android图片处理--缩放

正常加载图片双击放大手势随意缩放随意拖动查看图片每一个角落结合其他设置可实现翻转。

Gaga246的博客 693

DC-DC 转换器中的压电谐振器:当前状态和限制

在功率转换器应用中,居里温度较低的谐振器的 k 2和 Q M显着降低会导致效率降低,需要仔细的热处理。由于使用 PR 的功率转换器在不同的条件下运行,包括温度范围、电压偏置和功率电平,因此不可避免地会出现非线性效应,必须妥善解决这一问题,以免影响转换器的性能。等效电路模型(Butterworth Van-Dyke 或 BVD 模型)将压电谐振器在其机械谐振附近的电响应转换为一个简单电路,该电路由与由电极形成的输入电容 C 0并联的串联 RLC 动分支组成,见图图 1 还显示了阻抗与频率的关系。

2301_79716471的博客 1298

Android图片查看支持双击放大缩小、多点触摸

前一段时间写的,现在分享出来供大家参考。         研究过图库的源码,但着实太复杂,我都看不懂!也参考过网上的一些源码,但很多功能都不全,都不是我想要的! 结合网上的代码以及图库的部分源码自己写了一个类。         未实现的功能——逐级放大,这个矩阵变换把我弄晕了,而且项目中也用不到,所以就没再研究。         该模块主要实现了放大和原大两个级别的缩放。  功能有:

TMajier的博客 4万+

半导体制造技术导论(第二版)萧宏 第五章集成电路加热工艺答案

第二次退火是在较高温度下进行,并将电阻系数较高的c49碳化硅转变为电阻系数较低的c54碳。水平式高温炉加热、垂直式高温炉加热(即传统的管式炉加热)、快速加热工艺RTP、激光镭射。8. 集成电路芯片制造过程中,会使用垫底氧化层、阻挡氧化层、栅氧氧化层、屏蔽氧化层和全。氧化是最重要的加热过程之一,是一种添加工艺,将氧气加入到硅晶圆后,在晶圆表面形成二氧。为了满足元器件性能的要求,必须利用退火工艺将晶格的损伤修复,使其恢复单晶结构并激活掺。工艺氮气气流下将晶舟推入炉管,升高温度,稳定温度;

goal_achieving的博客 1864

基于Gurobi的综合能源系统运行优化:鲁棒两阶段优化方法

本文提出了一种基于Gurobi的综合能源系统鲁棒两阶段优化方法,针对包含换电站、光伏发电和电池储能的系统运行问题。研究采用多面体不确定性集合描述光伏出力随机性,构建了考虑电池衰减成本和弃光惩罚的两阶段优化模型:第一阶段制定日前调度计划,第二阶段处理实时运行中的不确定性。通过列与约束生成算法求解模型,并使用Python和Gurobi实现。仿真验证了该方法能有效平衡系统经济性与鲁棒性,为含高比例可再生能源的综合能源系统运行提供了实用解决方案。

huanghm88的专栏 242

Android图片预览功能(可旋转、缩放、左右切换)

我们要实现的效果 1、点击图片出现预览界面 2、可对图片进行旋转、缩放 3、能左右滑动,预览其他图片 4、单击预览界面后,回到上一界面 具体如下图:            使用到的第三方库 1、图片加载缓存库 Picasso:https://github.com/square/picasso 2、图片浏览缩放控件 PhotoView:https://git

yeaper_yeo的博客 1万+

ESP32-C3模组上跑通HTTPS分次传输文件(1)

ESP32-C3模组上跑通HTTPS分次传输文件(1)

phmatthaus的专栏 760

Android-打开相册选择单张图片

btn8.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { /*在Activity Action里面有一个“ACTION_GET_CONTENT”字符串常量, // 该常量让用户选择特定类型的数据,并返回该数据的URI.我

火星男孩的分享空间 2138

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

【WorkBuddy专栏50】代码开发技术体系深度分析——前端、后端、全栈、移动端、数据工程,WB和CODEBUDDY谁更擅长?

AI人人懂 238

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

android实现图片预览

代码是拿别人的改的 ,原来的有些BUG ,项目加载的都是网络图片 还没弄左右滑动效果   yi 工具类 [java] package com.lin.image;      import android.content.Context;  import android.graphics.Bitmap;  import android.graphics.Matrix;

1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android图片预览功能-缩放、平移

有一种效果你值得拥有,像ViewPager预览图片集的功能是各个APP上都会用到的,这里提供一个好用的封装的控件,先看效果:

Anonymous 6492

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Android图片多图预览点击放大ImagePreview

ImagePreview一个非常好用的图片预览工具库 不需要我们任何布局,只需要简单的初始化,放入数据即可,就可以实现非常好看的图片预览(多图)。 1.首先我们先引入依赖 implementation 'com.ycjiang:ImagePreview:2.3.5' 2.初始化 ZoomMediaLoader.getInstance().init(new TestImageLoader()); 3.放入数据 private List<UserViewIn

xujinhao521的博客 7729

Android中点击图片进行图片预览功能的实现(ImagePreview图片预览工具库)

因为需求,对于轮播图进行一个点击预览的功能,看了好多的文章,都没有弄出来,还是多亏了昊昊猿博主 点击查看原文 终于把它搞定啦。 这里的话是使用ImagePreview,一个非常好用的图片预览工具库(还可以实现双击放大等功能),它不需要我们创建任何布局,只需要简单的初始化,放入数据,就可以实现图片预览(多图),话不多说,先上效果图: 接下来,就去讲讲如何实现的吧 1.导入依赖包 implementation 'com.github.bumptech.glide:glide:4.9.0' //..

kaolagirl的博客 8418
上一篇: ListView和ScrollView的结合 解决方法
下一篇: 仅仅是个人记录:Android 的机型适配: 屏幕适配(包括dpi,dp,sp的概念) 版本适配 硬件适配。 以及如何和美工配合
千雅爸爸
博客等级 码龄18年 292粉丝 639原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值