Android界面编程之实现改变图片透明度并提供细节查看
(在图片浏览器上添加功能)
要想实现图片查看细节功能,我们首先来看一下BitmapDrawable和Bitmap的概念
Bitmap,代表一个位图图像,Android支持三种格式的位图图像:.png (preferred),.jpg (acceptable), .gif (discouraged)。
括号里的说明,代表这三种格式的图片在Android中的支持情况,.png格式图片优先,.jpg格式也可以,但是效果没有.png好,.gif支持最差。
可以直接使用图片的名称作为资源ID,来直接引用一个位图图片。也可以再XML文件中创建一个资源别名的ID。
在构建应用的时候,Bitmap文件可能会被appt工具压缩自动优化为无损图像。例如,一个真彩色PNG,不需要超过256的颜色可以被转换成一个8位PNG和调色板。这将导致一个图像质量相同,但这需要更少的内存。所以要意识到,在drawable目录中图像的二进制文件在构建程序时可以改变。如果你打算读一个图像作为字节流并将它转换成一个位图,把你的图片放在在res /raw/文件夹里,在那里他们不会被优化。
引用自网友http://blog.csdn.net/lonelyroamer/article/details/8147542
BitMap类方法:
public void recycle()——回收位图占用的内存空间,把位图标记为Dead
public final boolean isRecycled() ——判断位图内存是否已释放
public final int getWidth()——获取位图的宽度
public final int getHeight()——获取位图的高度
public final boolean isMutable()——图片是否可修改
public int getScaledWidth(Canvas canvas)——获取指定密度转换后的图像的宽度
public int getScaledHeight(Canvas canvas)——获取指定密度转换后的图像的高度
public boolean compress(CompressFormat format, int quality, OutputStream stream)——按指定的图片格式以及画质,将图片转换为输出流。
format:Bitmap.CompressFormat.PNG或Bitmap.CompressFormat.JPEG
quality:画质,0-100.0表示最低画质压缩,100以最高画质压缩。对于PNG等无损格式的图片,会忽略此项设置。
常用的静态方法:
public static Bitmap createBitmap(Bitmap src) ——以src为原图生成不可变得新图像
public static Bitmap createScaledBitmap(Bitmap src, int dstWidth,
int dstHeight, boolean filter)——以src为原图,创建新的图像,指定新图像的高宽以及是否可变。
public static Bitmap createBitmap(int width, int height, Config config)——创建指定格式、大小的位图
public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)以source为原图,创建新的图片,指定起始坐标以及新图像的高宽。
思路:
当点击增大透明度按钮时增加透明度,当点击减小透明度按钮时减小透明度,当减到最小时不再减小,透明度最大时不再增加,当点击图片时,在另一个ImageView中显示出放大的部位。
首先我们要创建两个ImageView来分别盛放原图和放大后的图片,当触摸图片的时候提供细节查看
看布局文件:
<LinearLayout
android:layout_width="300dp"
android:layout_height="100dp"
android:id="@+id/lin"
>
<Button
android:id="@+id/btnPlus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透明度加大"/>
<Button
android:id="@+id/btnMinus"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="透明度减小"/>
<Button
android:id="@+id/btnNext"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="下一页"/>
</LinearLayout>
<ImageView
android:id="@+id/image1"
android:layout_width="wrap_content"
android:layout_height="240px"
android:layout_gravity="center_horizontal"
android:scaleType="fitStart"
android:src="@drawable/img1"
android:adjustViewBounds="true"
app:layout_constraintTop_toBottomOf="@id/lin"
/>
<ImageView
android:id="@+id/image2"
android:layout_width="120dp"
android:layout_height="120dp"
android:layout_marginTop="10dp"
android:layout_marginBottom="100dp"
app:layout_constraintTop_toBottomOf="@id/image1"
/>
下面来书写代码,主要是创建监听器来监听对APP的操作,从而按要求更改图片状态(修改图片透明度方法为setImageAlpha(透明度),透明度为整数0~255)。
public class MainActivity extends AppCompatActivity {
private int images[]=new int[]{R.drawable.img1,R.drawable.img2,R.drawable.img3};
private int i=1;
private int alpha=255;//初始透明度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Button plus=(Button)findViewById(R.id.btnPlus);
final Button minus=(Button)findViewById(R.id.btnMinus);
Button next = (Button)findViewById(R.id.btnNext);
final ImageView image1 = (ImageView)findViewById(R.id.image1);
final ImageView image2 = (ImageView)findViewById(R.id.image2);
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
image1.setImageResource(images[++i%images.length]);
}
});
View.OnClickListener listener = new View.OnClickListener() {
@Override
public void onClick(View view) {
if (view==plus)
alpha+=20;
if (view==minus)
alpha-=20;
if (alpha>255)
alpha=255;
if (alpha<0)
alpha=0;
image1.setImageAlpha(alpha);
}
};
plus.setOnClickListener(listener);
minus.setOnClickListener(listener);
image1.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
BitmapDrawable bitmapDrawable = (BitmapDrawable)image1.getDrawable();
Bitmap bitmap = bitmapDrawable.getBitmap();
double scale = bitmap.getHeight()/240.0;
int x = (int)(motionEvent.getX()*scale);
int y = (int)(motionEvent.getY()*scale);
if (x+120>bitmap.getWidth())
x=bitmap.getWidth()-120;
if (y+120>bitmap.getHeight()-120)
y=bitmap.getHeight()-120;
image2.setImageBitmap(Bitmap.createBitmap(bitmap,x,y,120,120));
image2.setImageAlpha(alpha);
return true;
}
});
}
}
实现效果: