最近在做一个类似于游标的东西,由一个类似于seekbar的view来控制下端view内容的显示位置。所以需要将view中的内容映射成一张图片,设为seekbar的背景。所以就做了一些尝试,不过还有一些遗漏的小问题。
在Android中自有获取view中的cache内容,然后将内容转换成bitmap,方法名是:getDrawingCache(),返回结果为Bitmap,但是刚开始使用的时候,得到的结果都是null,所以在一个论坛里查到了正确的使用方法.代码如下:
contentLayout.setDrawingCacheEnabled(true);
contentLayout.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
contentLayout.layout(0, 0, contentLayout.getMeasuredWidth(),
contentLayout.getMeasuredHeight());
contentLayout.buildDrawingCache();
Bitmap bitmap= contentLayout.getDrawingCache();
最后就可以调用:Bitmap bitmap = view.getDrawingCache();就可以得到图片了。
为了测试这个功能,我使用了两种方式来创建LinerLayout中的内容,一种是在xml文件中就将view的内容添加了,只需在代码中添加对应ImageView中的图片就行了;另一种是动态添加LinerLayout中的View。
项目的主界面为:
接下来是SET_VIEW的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.set_view);
contentLayout = (LinearLayout) findViewById(R.id.content);
imgSource1 = (ImageView) findViewById(R.id.imgSource1);
imgSource2 = (ImageView) findViewById(R.id.imgSource2);
imgCache = (ImageView) findViewById(R.id.imgCache);
imgSource1.setImageResource(R.drawable.source1);
imgSource2.setImageResource(R.drawable.source2);
contentLayout.setDrawingCacheEnabled(true);
contentLayout.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
contentLayout.layout(0, 0, contentLayout.getMeasuredWidth(),
contentLayout.getMeasuredHeight());
contentLayout.buildDrawingCache();
Bitmap bitmap= contentLayout.getDrawingCache();
if(bitmap!=null){
imgCache.setImageBitmap(bitmap);
}else{
Log.i("CACHE_BITMAP", "DrawingCache=null");
}
}
set_view.xml布局文件为:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="set_view" android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
<LinearLayout android:id="@+id/content"
android:orientation="vertical" android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView android:id="@+id/imgSource1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
<ImageView android:id="@+id/imgSource2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></ImageView>
</LinearLayout>
<LinearLayout android:id="@+id/cache"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<ImageView android:id="@+id/imgCache" android:layout_width="wrap_content"
android:layout_height="wrap_content">
</ImageView>
</LinearLayout>
</LinearLayout>
运行效果为:
第一种情况比较简单,不会出现问题,接下来是第二种情况,这种情况有个需要注意的地方:
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.add_view);
addViewContent = (LinearLayout) findViewById(R.id.addViewContent);
imgAddViewCache = (ImageView) findViewById(R.id.imgAddViewCache);
// addImgSource();
addRelativeLayout();
addViewContent.setDrawingCacheEnabled(true);
addViewContent.measure(
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
addViewContent.layout(0, 0, addViewContent.getMeasuredWidth(),
addViewContent.getMeasuredHeight());
addViewContent.buildDrawingCache();
int color = addViewContent.getDrawingCacheBackgroundColor();
Bitmap cacheBitmap = addViewContent.getDrawingCache();
Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);//注意:这地方必须特别注意
if (bitmap != null) {
imgAddViewCache.setImageBitmap(bitmap);
imgAddViewCache.setDrawingCacheBackgroundColor(color);
} else {
Log.i("CACHE_BITMAP", "DrawingCache=null");
}
}
private void addRelativeLayout() {
// TODO Auto-generated method stub
RelativeLayout.LayoutParams layoutpare = new RelativeLayout.LayoutParams(
LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
RelativeLayout relativeLayout = new RelativeLayout(this);
relativeLayout.setLayoutParams(layoutpare);
ImageView imgView1 = new ImageView(this);
ImageView imgView2 = new ImageView(this);
imgView1.setImageResource(R.drawable.source1);
imgView2.setImageResource(R.drawable.source2);
RelativeLayout.LayoutParams img1 = new RelativeLayout.LayoutParams(38,
38);
img1.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
RelativeLayout.LayoutParams img2 = new RelativeLayout.LayoutParams(38,
38);
img2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
relativeLayout.addView(imgView1, img1);
relativeLayout.addView(imgView2, img2);
addViewContent.addView(relativeLayout);
}
/**
* 添加图片源
*/
private void addImgSource() {
ImageView imgView1 = new ImageView(this);
ImageView imgView2 = new ImageView(this);
imgView1.setImageResource(R.drawable.source1);
imgView2.setImageResource(R.drawable.source2);
addViewContent.addView(imgView1, new LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
addViewContent.addView(imgView2, new LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT));
}
对于上面的代码,需要说明一下:一种我是直接添加ImageView到页面中,这种情况没有问题,后来我又尝试了新建一个RelativeLayout中添加布局文件,
发现如果没有“代码中注释:注意”的一行时,混出现运行时的异常:trying to use a recycled bitmap android.graphics.Bitmap.这个问题我debug了很久,
也没有找到很彻底的方法来解决,不过用“注意”的一行代码就能够实现。但是显示的时候会出现意想不到的结果,关于出现的问题可以看下面的图:
布局添加的图片没有全部显示出来,只显示了一个,这个原因我还没有解决,最近几天我会试着解决。
add_view.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:text="add_view" android:layout_width="fill_parent"
android:layout_height="wrap_content"></TextView>
<LinearLayout android:id="@+id/addViewContent"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="wrap_content">
</LinearLayout>
<LinearLayout android:id="@+id/addViewCache"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<ImageView android:id="@+id/imgAddViewCache"
android:layout_width="fill_parent" android:layout_height="wrap_content">
</ImageView>
</LinearLayout>
</LinearLayout>
- 大小: 65 KB
- 大小: 67.8 KB
- 大小: 65.4 KB
分享到:
相关推荐
Bitmap,也称为位映射或栅格图像,是由像素数组构成的,每个像素都有自己的颜色值,这些颜色值组合起来就形成了我们看到的图像。在Android系统中,Bitmap是用于表示图像数据的主要类,它在内存中以二维数组的形式...
对于更复杂的圆形图片,我们可以省略设置RectF的步骤,直接将Bitmap的宽度和高度设置为相同,这样BitmapShader就会自动将其绘制成圆形。 此外,Android也提供了其他的解决方案,比如使用自定义View或者ImageView...
BaseAdapter是Adapter的一个基类,可以将数据集合(如ArrayList)映射到GridView上。你需要在Adapter中实现以下方法: - `getCount()`:返回数据集合的大小,决定GridView的行数。 - `getItem(int position)`:...
11. **动画与帧动画**:Android的Animation框架可以创建平滑的图像动画,而帧动画则可以将一系列图像播放成动画效果。 这些知识点构成了Android图像处理的基础,通过学习和实践,开发者可以创建出各种各样的图像...
在这个例子中,我们创建了一个带有圆角的矩形Path,然后通过Matrix将Bitmap映射到这个Path上,实现圆角图片。 在给定的博客文章中,作者可能提供了更详细的实现,包括自定义View的实现,以便更好地控制图片的显示。...
在Android开发中,将图片裁剪为圆形是常见的需求,比如在设计用户头像时,为了达到美观的效果,经常需要将方形图片转换成圆形。这个"Android裁剪图片为圆形图片Demo"就是一个实现这一功能的示例项目。下面将详细解释...
通过坐标转换,将屏幕上的手势操作映射到Bitmap上。 2. **Matrix类**:Matrix是Android中用于图像变换的核心类,可以实现旋转、缩放、平移等操作。 3. **自定义View**:自定义一个View来处理裁剪逻辑,通常继承自...
`setPadding`设置View内部内容区域与边框之间的距离,不会影响其他View的位置。`setMargin`设置View与其相邻View之间的距离,会影响布局中其他View的相对位置。 8. **Android最简单播放GIF动画方法** 可以使用...
Android的文件系统与Java相似,但提供了`android.os.MemoryFile`类以实现高效的内存映射文件操作。 问题四:EditText控件无法代码设置ReadOnly只读 在Android中,可以通过设置EditText的属性`android:inputType=...
2. Bitmap:Bitmap是Android中用于存储像素数据的对象,可以进行图像加载、显示、裁剪、旋转、缩放等操作。Bitmap的内存管理需要注意,避免内存泄漏。 3. Path:Path对象用于定义复杂的几何路径,可结合Canvas进行...
3. Bitmap与Shader:Bitmap是Android中的像素图像,Shader则用于在Bitmap上应用复杂的着色效果,如颜色渐变、图案填充等。 4. Drawables:Android提供的Drawable类族,包括BitmapDrawable、ShapeDrawable等,提供了...
在Android中,Activity、Adapter和View可以映射为MVC的各个部分。 **其他面试重点** - View的刷新:通过Handler发送消息,然后在Handler中调用`invalidate()`或`postInvalidate()`刷新界面。 - 内存泄露:未关闭的...
本教程将详细讲解如何在Android Studio中利用OpenGL ES绘制一个三棱锥,并对其表面进行纹理贴图,使三棱锥的各个面展示出不同的图像效果。 首先,我们需要在Android Studio项目中设置OpenGL ES环境。创建一个新的...
这一联盟将会支持 Google 发布的 Android 手机操作系统或者应用软件,共同开发名为 Android 的 开 放源代码的移动系统。开放手机联盟包括手机制造商、手机芯片厂商和移动运营商几类。目前,联盟成员 数 量已经达到了...
在绘制折线图时,需要将24小时的时间映射到X轴,而温度值映射到Y轴,这涉及到坐标转换的计算。 5. **测量与布局**: 在Android中,View需要在onMeasure()方法中确定其大小,然后在onDraw()方法中进行绘制。因此,...
在Android开发中,图片特效处理是一项重要的技能,它涉及到用户界面的..."项目说明.rar"和"android常用图片特效处理"这两个文件很可能是实际代码示例和详细教程,打开并学习它们将有助于加深理解和提升实际操作能力。
在技术实现上,AndroidHeatMap控件基于Android的Canvas和Paint类,通过自定义View进行绘制。开发者可以通过设置颜色映射、点击事件监听等来定制热图的显示效果。颜色映射可以根据点击次数或者权重来确定各个区域的...
- **Canvas**:是Android中用于在Bitmap或者Surface上绘制图形的对象,支持多种绘制操作,如画线、画圆、填充形状等。 - **Shader**:在OpenGL ES中,Shader是一种编程语言,用于在GPU上执行复杂的图形计算,如...
源码可能涉及顶点坐标、纹理映射、着色器编程等内容。 6. **图片库与组件**:Android有许多第三方图片库,如Glide、Picasso等,它们简化了图片的加载和显示。源码可能包含如何集成并使用这些库的实例。 7. **...