2012-12-05 19:24:34 far_sight 阅读数 676

如果想改变图片的大小,可以先得到图片的位图对象后,改变位图大小,再设置到ImageView中去,
本编讲的是怎样改变位图的大小示例,该示例把位图放大了1/4
(假设bm是位图Bitmap对象, iv是ImageView对象,int curDegrees = 0)
int bmpW = bm.getWidth();
int bmpH = bm.getHeight();
//设置图片放大比例
 double scale = 1.25;
 //计算出缩放比例的比例
 int scaleW = 1;
 int scaleH = 1;
 scaleW = (float)(scaleW*scale);
 scaleH = (float)(scaleH*scale);
 //产生reSize后的Bitmap对象
 android.graphics.Matrix mt = new android.graphics.Matrix();
 mt.postScale(scaleW, scaleH);
 Bitmap resizeBmp = Bitmap.createBitmap(bm, 0, 0, bmpW, bmpH, mt, true);

 iv.setImageBitmap(resizeBmp);

2011-01-05 23:27:42 xinqiqi123 阅读数 31
view plaincopy to clipboardprint? 
private Bitmap getImageFromAssetFile(String fileName,int how){
Bitmap image = null ;
try {
AssetManager am = game.getAssets();
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}catch (Exception e){ }
return zoomImage(image,how);
}
public Bitmap zoomImage(Bitmap bgimage,int how) {
int bmpwidth = bgimage.getWidth();
int bmpheight = bgimage.getHeight();
float scaleWidth=0;
float scaleHeight=0;
Matrix matrix = new Matrix();
if(how==0){
scaleWidth = ((float) width) / bmpwidth;
scaleHeight = ((float) height) / bmpheight;
}else{
scaleWidth=Math.min(width,height)/bmpwidth;
scaleHeight=Math.min(width, height)/bmpheight;
}
private Bitmap getImageFromAssetFile(String fileName,int how){
Bitmap image = null ;
try {
AssetManager am = game.getAssets();
InputStream is = am.open(fileName);
image = BitmapFactory.decodeStream(is);
is.close();
}catch (Exception e){ };
return zoomImage(image,how);
}
public Bitmap zoomImage(Bitmap bgimage,int how) {
int bmpwidth = bgimage.getWidth();
int bmpheight = bgimage.getHeight();
float scaleWidth=0;
float scaleHeight=0;
Matrix matrix = new Matrix();
if(how==0){
scaleWidth = ((float) width) / bmpwidth;
scaleHeight = ((float) height) / bmpheight;
}else{
scaleWidth=Math.min(width,height)/bmpwidth;
scaleHeight=Math.min(width, height)/bmpheight;
}
2012-03-30 00:42:11 hello_haozi 阅读数 10578

动态修改ListView文字大小


写了一个MyAdapter(继承了BaseAdapter)去实现数据和UI的显示。通过滑动SeekBar来改变MyAdapter的getView方法中View的字体大小进而实现了改变ListView中文字大小的效果。


效果图:

          


1 MainActivity的布局文件main.xml:

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

	<ListView 
	    android:id="@+id/listview01"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    ></ListView>
	<SeekBar 
	    android:id="@+id/seekbar01"
	    android:layout_width="fill_parent"
	    android:layout_height="wrap_content"
	    android:layout_alignParentBottom="true"
	    />
</RelativeLayout>

2 ListView的item布局文件main_listview01_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <TextView 
        android:id="@+id/textView01"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="23sp"
        />
    <TextView 
        android:id="@+id/textView02"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:textSize="15sp"
        />

</LinearLayout>

3 MyAdapter源码

/**
 * 我的适配器
 * @author haozi
 *
 */
public class MyAdapter extends BaseAdapter {

	public static int PROGRESS;
	private Context context;
	private List<? extends Map<String, ?>> mData;
	private int mResource;
	private String[] mFrom;
	private int[] mTo;
	private LayoutInflater mLayoutInflater;
	
	/**
	 * 我的适配器的构造方法
	 * @param context 调用方的上下文
	 * @param data 数据
	 * @param resource
	 * @param from 
	 * @param to
	 */
	public MyAdapter(Context context, List<? extends Map<String, ?>> data, int resource, String[] from, int[] to){
		
		this.context = context;
		this.mData = data;
		this.mResource = resource;
		this.mFrom = from;
		this.mTo = to;
		this.mLayoutInflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
	}
	
	/**
	 * 系统在绘制ListView之前,将会先调用getCount方法来获取Item的个数
	 */
	public int getCount() {
		
		return this.mData.size();
	}

	public Object getItem(int position) {
		
		return this.mData.get(position);
	}

	public long getItemId(int position) {
		
		return position;
	}

	/**
	 * 每绘制一个 Item就会调用一次getView方法,
	 * 在此方法内就可以引用事先定义好的xml来确定显示的效果并返回一个View对象作为一个Item显示出来。
	 * 也 正是在这个过程中完成了适配器的主要转换功能,把数据和资源以开发者想要的效果显示出来。
	 * 也正是getView的重复调用,使得ListView的使用更 为简单和灵活。
	 * 这两个方法是自定ListView显示效果中最为重要的,同时只要重写好了就两个方法,ListView就能完全按开发者的要求显示。
	 * 而 getItem和getItemId方法将会在调用ListView的响应方法的时候被调用到。
	 * 所以要保证ListView的各个方法有效的话,这两个方法也得重写。
	 */
	public View getView(int position, View contentView, ViewGroup parent) {
		
		contentView = this.mLayoutInflater.inflate(this.mResource, parent, false);	

		// 设置contentView的内容和样式,这里重点是设置contentView中文字的大小
		for(int index=0; index<this.mTo.length; index++){
			TextView textView = (TextView) contentView.findViewById(this.mTo[index]);
			textView.setText(this.mData.get(position).get(this.mFrom[index]).toString());
			if(index == 0){
				textView.setTextSize(23+PROGRESS);
			}else if(index == 1){
				textView.setTextSize(15+PROGRESS);
			}
		}

		return contentView;
	}
}

4 MainActivity源码

/**
 * 入口Activity
 * @author haozi
 *
 */
public class MainActivity extends Activity {
    
	private ListView mListView;
	private SeekBar mSeekBar;
	private MyAdapter myAdapter;
	private ArrayList<HashMap<String, String>> data;
	
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.main);
        
        // 代码和控件绑定
        this.mListView = (ListView) this.findViewById(R.id.listview01);
        this.mSeekBar = (SeekBar) this.findViewById(R.id.seekbar01);

        // 准备数据
        initData();
        // 设置SeekBar变化监听
        this.mSeekBar.setOnSeekBarChangeListener(new MSeekBarOnSeekBarChangeListener());
    }
    
    /**
     * 准备数据
     */
    private void initData(){
    	
    	data = new ArrayList<HashMap<String,String>>();
    	for(int index=0; index<5; index++){
    		HashMap<String, String> map = new HashMap<String, String>();
    		String textView01content = "textView01content" + index;
    		String textView02content = "textView02content" + index;
    		map.put("textView01", textView01content);
    		map.put("textView02", textView02content);
    		data.add(map);
    	}
    	// 创建适配器,并把数据交给适配器
    	this.myAdapter = new MyAdapter(this, data, R.layout.main_listview01_item, 
    			new String[]{"textView01", "textView02"}, 
    			new int[]{R.id.textView01, R.id.textView02});
        // 为listView添加适配器
        this.mListView.setAdapter(this.myAdapter);
    }
    
    /**
     * mSeekBar的变化监听
     * @author haozi
     *
     */
    class MSeekBarOnSeekBarChangeListener implements SeekBar.OnSeekBarChangeListener{

		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
			// TODO Auto-generated method stub
			MyAdapter.PROGRESS = progress/10;
			MainActivity.this.mListView.setAdapter(MainActivity.this.myAdapter);
		}

		public void onStartTrackingTouch(SeekBar seekBar) {
			// TODO Auto-generated method stub
			
		}

		public void onStopTrackingTouch(SeekBar seekBar) {
			// TODO Auto-generated method stub
			
		}
    }
}


demo下载链接地址:http://download.csdn.net/detail/hello_haozi/4290909

2015-10-17 21:27:14 l416112167 阅读数 3879

ColorMatrix的颜色矩阵介绍

  • 颜色矩阵M是一个5*4的矩阵,在Android中,颜色矩阵M是以一维数组m=[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t]的方式进行存储的。如下图1:

图1 颜色矩阵M
图1 颜色矩阵M

他通过RGBA四个通道来直接操作对应颜色,达到修改图像的效果。

  • 第一行决定红色 R
  • 第二行决定绿色 G
  • 第三行决定蓝色 B
  • 第四行决定了透明度 A
  • 第五列是颜色的偏移量

原图的RGBA的ColorMatrix颜色矩阵数组为:

[ 1, 0, 0, 0, 0,
  0, 1, 0, 0, 0,
  0, 0, 1, 0, 0,
  0, 0, 0, 1, 0]
  • 在一张图片中,图像的RGBA(红色、绿色、蓝色、透明度)值决定了该图片所呈现出来的颜色效果。而图像的RGBA值则存储在一个5*1的颜色分量矩阵C中,由颜色分量矩阵C可以控制图像的颜色效果。颜色分量矩阵C 如图2所示:
    颜色分量矩阵C
    图2 颜色分量矩阵C

  • 要想改变一张图片的颜色效果,只需要改变图像的颜色分量矩阵即可。通过颜色矩阵可以很方便的修改图像的颜色分量矩阵。假设修改后的图像颜色分量矩阵为C1,则有如图3所示的颜色分量矩阵计算公式:
    这里写图片描述
    图3 颜色分量矩阵计算公式

通常,改变颜色分量时可以通过修改第5列的颜色偏移量来实现,如图4所示的颜色矩阵M1,通过计算后可以得知该颜色矩阵的作用是使图像的红色分量和绿色分量均增加100,这样的效果就是图片泛黄(因为红色与绿色混合后得到黄色)。
颜色矩阵M1
图4 颜色矩阵M1

除此之外,也可以通过直接对颜色值乘以某一系数而达到改变颜色分量的目的。如图5所示的颜色矩阵M2,将绿色分量放大了2倍,这样的效果就是图片泛绿色。
颜色矩阵M2
图5 颜色矩阵M2

————以上内容收集于网络:http://www.android100.org/html/201406/05/19490.html———-


使用ColorMatrix改变图片颜色的步骤

  • 通过Bitmap.createBitmap()方法获得一个空白的Bitmap对象。
  • 使用Bitmap对象创建画布Canvas, 然后创建画笔Paint。
  • 定义ColorMatrix,并指定RGBA矩阵。
  • 使用ColorMatrix创建一个ColorMatrixColorFilter对象, 作为画笔的滤镜 paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix))。
  • 使用Canvas.drawBitmap()方法把原图使用定义的Paint画到空白的Bitmap对象上即可获得改变RGBA值后的图像。

图像颜色处理实例

  • 首先准备一张用来修改颜色的黑色原始图片 btn_pause.png 如下:
    这里写图片描述

  • 布局文件 colormatrix_activity.xml 内容如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:orientation="vertical">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="R" />

    <SeekBar
        android:id="@+id/sb_red"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="0" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="G" />

    <SeekBar
        android:id="@+id/sb_green"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="0" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="B" />

    <SeekBar
        android:id="@+id/sb_blue"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="0" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="A" />

    <SeekBar
        android:id="@+id/sb_alpha"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="255"
        android:progress="255" />

    <ImageView
        android:id="@+id/iv_color_show"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="30dp"
        android:layout_gravity="center_horizontal"
        android:src="@drawable/btn_pause" />

</LinearLayout>
  • 界面代码 ColorMatrixActivity.java
/**
 * Created by lvzhengbin on 15/10/15.
 */
public class ColorMatrixActivity extends ActionBarActivity {

    private SeekBar sb_red, sb_green, sb_blue, sb_alpha;
    private ImageView iv_show;
    private Bitmap afterBitmap;
    private Paint paint;
    private Canvas canvas;
    private Bitmap baseBitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.colormatrix_activity);
        initView();
    }

    private void initView() {
        iv_show = (ImageView) findViewById(R.id.iv_color_show);
        sb_red = (SeekBar) findViewById(R.id.sb_red);
        sb_green = (SeekBar) findViewById(R.id.sb_green);
        sb_blue = (SeekBar) findViewById(R.id.sb_blue);
        sb_alpha = (SeekBar) findViewById(R.id.sb_alpha);

        sb_red.setOnSeekBarChangeListener(seekBarChange);
        sb_green.setOnSeekBarChangeListener(seekBarChange);
        sb_blue.setOnSeekBarChangeListener(seekBarChange);
        sb_alpha.setOnSeekBarChangeListener(seekBarChange);

        baseBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.btn_pause);
        // 1.获取一个与baseBitmap大小一致的可编辑的空图片
        afterBitmap = Bitmap.createBitmap(baseBitmap.getWidth(),
                baseBitmap.getHeight(), baseBitmap.getConfig());
        // 2.使用Bitmap对象创建画布Canvas, 然后创建画笔Paint。
        canvas = new Canvas(afterBitmap);
        paint = new Paint();
    }

    private SeekBar.OnSeekBarChangeListener seekBarChange = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            if(seekBar.getId() == R.id.sb_alpha){
                iv_show.getDrawable().setAlpha(sb_alpha.getProgress());

            }else{
                float progressR = sb_red.getProgress();
                float progressG = sb_green.getProgress();
                float progressB = sb_blue.getProgress();
                // 根据SeekBar定义RGBA的矩阵, 通过修改矩阵第五列颜色的偏移量改变图片的颜色
                float[] src = new float[]{
                        1, 0, 0, 0, progressR,
                        0, 1, 0, 0, progressG,
                        0, 0, 1, 0, progressB,
                        0, 0, 0, 1, 0};

                // 3.定义ColorMatrix,并指定RGBA矩阵
                ColorMatrix colorMatrix = new ColorMatrix();
                colorMatrix.set(src);
                // 4.使用ColorMatrix创建一个ColorMatrixColorFilter对象, 作为画笔的滤镜, 设置Paint的颜色
                paint.setColorFilter(new ColorMatrixColorFilter(src));
                // 5.通过指定了RGBA矩阵的Paint把原图画到空白图片上
                canvas.drawBitmap(baseBitmap, new Matrix(), paint);
                iv_show.setImageBitmap(afterBitmap);
            }
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onProgressChanged(SeekBar seekBar, int progress,boolean fromUser) {
        }
    };
}
  • 我们可以通过SeekBar调节RGB的值来修改图片的颜色来达到不同的效果,运行效果如下:
    这里写图片描述
2010-12-16 16:10:07 yelinsen05 阅读数 49
/**
* Returns a Bitmap representing the thumbnail of the specified Bitmap.
* The size of the thumbnail is defined by the dimension
* android.R.dimen.launcher_application_icon_size.
*
* This method is not thread-safe and should be invoked on the UI thread only.
*
* @param bitmap The bitmap to get a thumbnail of.
* @param context The application's context.
*
* @return A thumbnail for the specified bitmap or the bitmap itself if the
* thumbnail could not be created.
*/
public static Bitmap createBitmapThumbnail(Bitmap bitmap, Context context)
{
if(FusionField.iconWidth == -1&&(FusionField.screenWidth == 800 && FusionField.screenHeight == 480)){
FusionField.iconWidth = 80;
FusionField.iconHeight = 98;

}
else if (FusionField.iconWidth == -1)
{
FusionField.iconWidth = 60;
FusionField.iconHeight = 82;
}

final int bitmapWidth = bitmap.getWidth();
final int bitmapHeight = bitmap.getHeight();

Log.e("dean xiang", "" + bitmapWidth + ":" + bitmapHeight);
if (FusionField.iconWidth > 0 && FusionField.iconHeight > 0)
{

final Bitmap.Config c = Bitmap.Config.ARGB_8888;
final Bitmap thumb = Bitmap
.createBitmap(FusionField.iconWidth, FusionField.iconHeight, c);
final Canvas canvas = sCanvas;
final Paint paint = sPaint;

canvas.setBitmap(thumb);
paint.setDither(false);
paint.setFilterBitmap(true);
// int offsetX = Math.abs(sIconWidth - bitmapWidth) / 2;
// int offsetY = Math.abs(sIconHeight - bitmapHeight) / 2;
//
// sBounds.set(offsetX, offsetY, bitmapWidth + offsetX,
// bitmapHeight + offsetY);
// sOldBounds.set(0, 0, bitmapWidth, bitmapHeight);
// canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint);

sBounds.set(0, 0, FusionField.iconWidth, FusionField.iconHeight);
sOldBounds.set(0, 0, bitmapWidth, bitmapHeight);
canvas.drawBitmap(bitmap, sOldBounds, sBounds, paint);
return thumb;
}

return bitmap;
}
没有更多推荐了,返回首页