❶ android怎样将canvas绘制的图形保存到bitmap中
可以用Bitmap.compress函数来把Bitmap对象保存成PNG或JPG文件,然后可以用BitmapFactory把文件中的数据读进来再生成Bitmap对象。
保存的代码大概类似于这样:
try {
FileOutputStream out = new FileOutputStream(filename);
bmp.compress(Bitmap.CompressFormat.PNG, 90, out);
} catch (Exception e) {
e.printStackTrace();
}
具体的可以去查Bitmap和BitmapFactory的帮助文档。
❷ Android里怎么动态设置按照一张图片高度的百分比列来显示
ImageView的LayoutParam都设置为wrap_content并设置 android:scaleType="matrix"代码里创建MatrixMatrix matrix = new Matrix();Matrix matrix = new Matrix();matrix.postScale(0.5f, 1f);//宽缩小到50%,高度不变img.setImageMatrix(matrix);
❸ android Matrix.setRotate 鍜 postRotate镄勫尯鍒
Matrix涓昏佺敤浜庡瑰钩闱㈣繘琛屽钩绉(Translate)锛岀缉鏀(Scale)锛屾棆杞(Rotate)浠ュ强鏂滃垏(Skew)镎崭綔銆
涓虹亩鍖栫烦阒靛彉鎹锛孉ndroid灏佽呬简涓绯诲垪鏂规硶𨱒ヨ繘琛岀烦阒靛彉鎹锛涘叾涓鍖呮嫭锛
set绯诲垪鏂规硶锛歴etTranslate锛宻etScale锛宻etRotate锛宻etSkew锛涜剧疆锛屼细瑕嗙洊涔嫔墠镄勫弬鏁般
pre绯诲垪鏂规硶锛歱reTranslate锛宲reScale锛宲reRotate锛宲reSkew锛涚烦阒靛厛涔桡纴濡侻' = M * T(dx, dy)銆
post绯诲垪鏂规硶锛歱ostTranslate锛宲ostScale锛宲ostRotate锛宲ostSkew锛涚烦阒靛悗涔桡纴濡侻' = T(dx, dy) * M銆
阃氲繃灏嗗彉鎹㈢烦阒典笌铡熷嬬烦阒电浉涔樻潵杈惧埌鍙樻崲镄勭洰镄勶纴渚嫔傦细
骞崇Щ锛坸'=x+tx锛泍'=y+ty锛夛细
缂╂斁锛坸'=sx*x锛泍'=sy*y锛夛细
镞嬭浆锛坸'=cos尾*x-sin尾*y锛泍'=sin尾*x+cos尾*y锛夛细
阃夋嫨闇瑕佺敤鍒板备笅镄勪笁瑙掑嚱鏁扮殑鍏寮忥细
鈶爏in(伪+尾)=sin伪cos尾+cos伪sin尾
鈶cos(伪+尾)=cos伪cos尾-sin伪sin尾
鍏寮忊憼鍙浠ョ敱鍗曚綅鍦嗘柟娉曟垨镓桦嫆瀵嗗畾鐞嗘帹瀵煎嚭𨱒ャ
鎺ㄥ艰繃绋嫔弬瑙侊细http://blog.sina.com.cn/s/blog_58260f420100c03j.html
鏂滃垏锛坸'=x+k1*y锛泍'=k2*x+y锛夛细
//婧愮爜鏂囦欢锛欤xternal\skia\legacy\src\core\SkMatrix.cpp
#define SK_Scalar1 (1.0f)
#define kMatrix22Elem SK_Scalar1
typedef float SkScalar;
#define SkScalarMul(a, b) ((float)(a) * (b))
enum {
kMScaleX, kMSkewX, kMTransX,
kMSkewY, kMScaleY, kMTransY,
kMPersp0, kMPersp1, kMPersp2
};
void SkMatrix::reset() {
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //鍏跺间负1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMTransX] = fMat[kMTransY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //鍏跺硷纴鍏ㄤ负0
fMat[kMPersp2] = kMatrix22Elem; //鍏跺间负1
this->setTypeMask(kIdentity_Mask | kRectStaysRect_Mask);
}
void SkMatrix::setTranslate(SkScalar dx, SkScalar dy) {
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] = dx; //浠ユ柊鍊糳x瑕嗙洊铡熷硷纴铡熷兼棤鏁堜简
fMat[kMTransY] = dy;
fMat[kMScaleX] = fMat[kMScaleY] = SK_Scalar1; //鍏跺间负1
fMat[kMSkewX] = fMat[kMSkewY] =
fMat[kMPersp0] = fMat[kMPersp1] = 0; //鍏跺硷纴鍏ㄤ负0
fMat[kMPersp2] = kMatrix22Elem; //鍏跺间负1
this->setTypeMask(kTranslate_Mask | kRectStaysRect_Mask);
} else {
this->reset();
}
}
bool SkMatrix::preTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->preConcat(m); //鐭╅樀镄勫厛涔樿繍绠
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += SkScalarMul(fMat[kMScaleX], dx) +
SkScalarMul(fMat[kMSkewX], dy); //鍏堜箻锛岄渶瑕佺烦阒佃繍绠楄繃
fMat[kMTransY] += SkScalarMul(fMat[kMSkewY], dx) +
SkScalarMul(fMat[kMScaleY], dy);
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::postTranslate(SkScalar dx, SkScalar dy) {
if (this->hasPerspective()) {
SkMatrix m;
m.setTranslate(dx, dy);
return this->postConcat(m); //鐭╅樀镄勫悗涔樿繍绠
}
if (SkScalarToCompareType(dx) || SkScalarToCompareType(dy)) {
fMat[kMTransX] += dx; //钖庝箻锛岀洿鎺ュ姞鏂板糳x鍗冲彲
fMat[kMTransY] += dy;
this->setTypeMask(kUnknown_Mask | kOnlyPerspectiveValid_Mask);
}
return true;
}
bool SkMatrix::preConcat(