Android 弹出框Dialog并缩放图片
java代码
Activity:
// 调用dialog,参数:1:自身的activity,2:Bitmap bm读取好的图片
MyDialog dialog = new MyDialog(MyActivity.this, bm);
dialog.show();
Dialog类:
package wdw.action.demo; import wdw.action.R;
import android.app.Dialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.GestureDetector.OnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; public class MyDialog extends Dialog{ private GestureDetector mGestureDetector;
private Bitmap bm, bmTemp; private static final float SMALL_SCALE = 0.8f;
private static final float BIG_SCALE = 1.25f;
private int startX = , startY = ;
private int imageWidth, imageHeight;
private float scaleWidth = , scaleHeight = ;
private int displayWidth, displayHeight;
private ImageView imageView;
private Button imageSmall, imageBig, imageClose; public MyDialog(Context context, Bitmap bm) {
super(context,R.style.dialog);
this.bm = bm;
this.bmTemp = bm;
this.mGestureDetector = new GestureDetector(context, new ViewGestureListener());
} protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.img);
imageView = (ImageView) findViewById(R.id.myImageView);
imageSmall = (Button) findViewById(R.id.image_small);
imageBig = (Button) findViewById(R.id.image_big);
imageClose = (Button) findViewById(R.id.image_close); init();
writeImage();
bindListener();
}
private void init() {
DisplayMetrics dm = new DisplayMetrics();
getWindow().getWindowManager().getDefaultDisplay().getMetrics(dm);
displayWidth = dm.widthPixels;
displayHeight = dm.heightPixels;
imageWidth = bm.getWidth();
imageHeight = bm.getHeight();
}
private void writeImage() {
int w = (w = bmTemp.getWidth()) > displayWidth ? displayWidth : w;
int h = (h = bmTemp.getHeight()) > displayHeight ? displayHeight : h;
if (startX + w <= bmTemp.getWidth() && startY + h <= bmTemp.getHeight()) {
Bitmap bmOrg = Bitmap.createBitmap(bmTemp, startX, startY, w, h);
imageView.setImageDrawable(new BitmapDrawable(bmOrg));
}
}
private void buttonShow() {
imageSmall.setVisibility(View.VISIBLE);
imageBig.setVisibility(View.VISIBLE);
imageClose.setVisibility(View.VISIBLE);
}
private void bindListener() {
Button.OnClickListener imageButtonListener = new Button.OnClickListener() {
public void onClick(View v) {
switch (v.getId()) {
case R.id.image_small:
resize(SMALL_SCALE);
break;
case R.id.image_big:
resize(BIG_SCALE);
break;
case R.id.image_close:
MyDialog.this.dismiss();
break;
default:
break;
}
}
};
imageSmall.setOnClickListener(imageButtonListener);
imageBig.setOnClickListener(imageButtonListener);
imageClose.setOnClickListener(imageButtonListener);
}
public boolean onTouchEvent(MotionEvent event) {
buttonShow();
return mGestureDetector.onTouchEvent(event);
} private void resize(float scale) {
Matrix matrix = new Matrix();
scaleWidth = scaleWidth * scale;
scaleHeight = scaleHeight * scale;
matrix.postScale(scaleWidth, scaleHeight); bmTemp = Bitmap.createBitmap(bm, , , imageWidth, imageHeight, matrix, true);
writeImage(); // 小于图片实际大小就不让缩小
if (scaleWidth * scale * imageWidth < imageWidth || scaleHeight * scale * imageHeight < imageHeight) {
imageSmall.setEnabled(false);
imageSmall.setTextColor(Color.GRAY);
} else {
imageSmall.setEnabled(true);
imageSmall.setTextColor(Color.MAGENTA);
}
// 超过屏幕大小的5倍就不让放大
if (scaleWidth * scale * imageWidth > displayWidth * || scaleHeight * scale * imageHeight > displayHeight * ) {
imageBig.setEnabled(false);
imageBig.setTextColor(Color.GRAY);
} else {
imageBig.setEnabled(true);
imageBig.setTextColor(Color.MAGENTA);
} } class ViewGestureListener implements OnGestureListener{
public boolean onDown(MotionEvent e) {
return false;
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
public void onLongPress(MotionEvent e) {
}
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
startX = (startX + distanceX + displayWidth) > bmTemp.getWidth() ? startX : (int) (startX + distanceX);
startY = (startY + distanceY + displayHeight) > bmTemp.getHeight() ? startY : (int) (startY + distanceY);
startX = startX <= ? : startX;
startY = startY <= ? : startY;
writeImage();
return false;
}
public void onShowPress(MotionEvent e) {
}
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
} }
xml文件
/res/values/dialog.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="dialog" parent="@android:style/Theme.Dialog">
<item name="android:windowNoTitle">true</item>
</style>
</resources>
/res/layout/img.xml:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/frame_layout"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<LinearLayout
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:gravity="center"
>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/layoutImage"
>
<ImageView
android:id="@+id/myImageView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout>
<RelativeLayout
android:id="@+id/relative_layout"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<Button
android:id="@+id/image_small"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:gravity="left"
android:enabled="false"
android:visibility="gone"
android:text="-"
/>
<Button
android:id="@+id/image_close"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:visibility="gone"
android:text="X"
/>
<Button
android:id="@+id/image_big"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:gravity="right"
android:visibility="gone"
android:text="+"
/>
</RelativeLayout>
</FrameLayout>
Android 弹出框Dialog并缩放图片的更多相关文章
- android 弹出框(输入框和选择框)
1.输入框: final EditText inputServer = new EditText(this); inputServer.setFilters(new InputFilter[]{new ...
- Android 弹出框
1.Java package com.fish.helloworld; import android.app.Activity; import android.app.AlertDialog; imp ...
- Android 弹出对话框Dialog充满屏幕宽度
final View view = LayoutInflater.from(context).inflate(layoutId, null); final Dialog dialog = new Di ...
- bootstrop 日期控件 datepicker被弹出框dialog覆盖的解决办法
筒子们在使用bootstrap的日期控件(datepicker , 现在官网提供的名称叫 datetimepicker)时可能会遇到如上图的问题这是啥原因造成的呢? 答案很简单时输出的优先级造成的(z ...
- 点击datagrid弹出ldhdialog,点击弹出框的按钮,关闭且刷新datagrid
datagrid里的js这么写 //点击添加按钮触发 function superadd(title,addurl,gname,width,height) { gridname=gname; crea ...
- elementUI vue 页面加载的时候页面出现了黑字 页面优化处理 按钮弹出框文字
elementUI 页面如果需要加载很多东西的时候, 自己定义的按钮或者弹出框dialog的文字就会显示在页面上, 一闪而过, 因此需要优化一下, elementUI 提供的loading有遮罩层, ...
- CKEDITOR 4.6.X 版本 插件 弹出对话框 Dialog中 表格 Table 自定义样式Style 问题
项目开发过程中,发现CKEDITOR 插件的弹出框 内 如果跟据项目需要写表格(table tr td),表格的边框等属性会被 CKEDITOR的清除或覆盖,导致表格很难看. 问题关键: 插件弹出框d ...
- Android 如何利用Activity的Dialog风格完成弹出框设计
在我们使用Dialog时,如果需要用到很多自己设计的控件,虽然可以让弹出框显示出我们需要的界面,但却无法找到地方完成控制代码的编写,如何解决这个问题呢,我们可以将Activity伪装成Dialog弹出 ...
- android自定义弹出框样式实现
前言: 做项目时,感觉Android自带的弹出框样式比较丑,很多应用都是自己做的弹出框,这里也试着自己做了一个. 废话不说先上图片: 实现机制 1.先自定义一个弹出框的样式 2.自己实现CustomD ...
随机推荐
- thinkphp5.0 CURL用post请求接口数据
//测试 请求接口 public function index(){ $arr = array('a'=>'555','b'=>56454564); $data=$this->pos ...
- Service Discovery protocol(SDP)
locating services provided by Volume 3 , Part C , section 8 2.1sdp client-server architecture 2.2 se ...
- HttpURLConnection发送GET、POST请求
HttpURLConnection发送GET.POST请求 /** * GET请求 * * @param requestUrl 请求地址 * @return */ public String get( ...
- iddler抓包过程以及fiddler抓包手机添加代理后连不上网解决办法
转载自:https://blog.csdn.net/m0_37554415/article/details/80434477,感谢博主的热心分享 1.(1)电脑端打开安装好的的fiddler,打开To ...
- Visual Studio 跨平台開發實戰(1) - Hello Xamarin! (转帖)
前言 應用程式發展的腳步, 從來沒有停過. 從早期的Windows 應用程式, 到網路時代的web 應用程式, 再到近幾年相當盛行的行動裝置應用程式(Mobile Application), 身為C# ...
- 【转】Python格式化字符串str.format()
原文地址:http://blog.xiayf.cn/2013/01/26/python-string-format/ 每次使用Python的格式字符串(string formatter),2.7及以上 ...
- 【Maven学习】maven-assembly-plugin的使用
转自http://liugang594.iteye.com/blog/2093607 maven-assembly-plugin使用描述(拷自 maven-assembly-plugin 主页) Th ...
- vue记事1
1.组件引入css. 例:test.vue引入swiper.min.css | -- src | | -- components | | -- test | | -- test.vue | | - ...
- InnoDB的分区表
分区功能并不是在存储引擎层完成的,因此不只有InnoDB存储引擎支持分区,常见的存储引擎MyISAM.NDB等都支持.但也并不是所有的存储引擎都支持,如CSV.FEDERATED.MERGE等就不支持 ...
- 【LeetCode题解】2_两数相加
目录 [LeetCode题解]2_两数相加 描述 方法一:小学数学 思路 Java 代码(非递归写法) Java 代码(递归写法) Python 代码(非递归写法) [LeetCode题解]2_两数相 ...