Androidはハイビジョン大図を表示
4596 ワード
の準備を
大きな画像があるとき、携帯電話の画面を超えたときにも、元の解像度をサポートして表示したいと思っています.この文章は、このような機能を実現するために使われています.この文章は主にカスタムViewの知識点に基づいています.大きく分けて次の2つのステップがあります.切り取り画像の一部のサイズは現在のサイズの に置く.はスライドをサポートする、スライドすると切り取った画像の部分 を更新する.
まず効果を見る
show.gif
最初のステップ
私たちはまずBitmapRegionDecoderというクラスを知っています.このクラスは1枚の画像を操作することができます.もともとBitmapの中の画像を切り取る方法を使いたいと思っていましたが、その後、このクラスがもっといいことに気づきました.次は彼の基本的な使い方です.
これで大きな画像の一部を切り取ることができます.この时、少し考えがあるのではないでしょうか.次のステップは、この画像をジェスチャーに従ってスライドさせることをサポートします.それから、画像に表示する必要がある部分を切り取って、Viewの上にレンダリングします.次は続けます.
ステップ2
ここで使うスライドジェスチャーツール類GestureDetector、できない仲間たち、私のこのコードを見てみれば、この道理がわかります.
これを終えて、ビューの初期化時にこのオブジェクトをインスタンス化します.
またonDrawでの操作も行います
基本的にコアコードはこれだけで、あといくつかありますが、計算するときにも使うので、必要なものがあれば少し覚えておいてください.
よし、これで大成功だ.githubコードアドレス
大きな画像があるとき、携帯電話の画面を超えたときにも、元の解像度をサポートして表示したいと思っています.この文章は、このような機能を実現するために使われています.この文章は主にカスタムViewの知識点に基づいています.大きく分けて次の2つのステップがあります.
まず効果を見る
show.gif
最初のステップ
私たちはまずBitmapRegionDecoderというクラスを知っています.このクラスは1枚の画像を操作することができます.もともとBitmapの中の画像を切り取る方法を使いたいと思っていましたが、その後、このクラスがもっといいことに気づきました.次は彼の基本的な使い方です.
InputStream inputStream = getResources().getAssets().open("world.jpg");
BitmapRegionDecoder bitmapRegionDecoder = BitmapRegionDecoder.newInstance(inputStream, false);
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.RGB_565;
Bitmap bitmapDraw = bitmapRegionDecoder.decodeRegion(mRect, mOptions);//mRect
これで大きな画像の一部を切り取ることができます.この时、少し考えがあるのではないでしょうか.次のステップは、この画像をジェスチャーに従ってスライドさせることをサポートします.それから、画像に表示する必要がある部分を切り取って、Viewの上にレンダリングします.次は続けます.
ステップ2
ここで使うスライドジェスチャーツール類GestureDetector、できない仲間たち、私のこのコードを見てみれば、この道理がわかります.
class MGestureListener implements GestureDetector.OnGestureListener {
@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
//Logger.i("--------scroll:" + distanceX + "," + distanceY);
float left = mRect.left + distanceX;
left = left < 0 ? 0 : left; //
float right = mRect.right + distanceX;
right = right > bitmapWidth ? bitmapWidth : right; //
float top = mRect.top + distanceY;
top = top < 0 ? 0 : top; //
float bottom = mRect.bottom + distanceY;
bottom = bottom > bitmapHeight ? bitmapHeight : bottom; //
// , mRect
if (left == 0) {
right = getMeasuredWidth();
}
if (right == bitmapWidth) {
left = bitmapWidth - getMeasuredWidth();
}
if (top == 0) {
bottom = getMeasuredHeight();
}
if (bottom == bitmapHeight) {
top = bitmapHeight - getMeasuredHeight();
}
mRect.left = (int) left;
mRect.right = (int) right;
mRect.top = (int) top;
mRect.bottom = (int) bottom;
Logger.e("---------width:" + (right - left) + ",height:" + (bottom - top));
invalidate(); // View
return true;
}
@Override
public boolean onDown(MotionEvent e) {
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
return false;
}
@Override
public void onLongPress(MotionEvent e) { }
@Override
public void onShowPress(MotionEvent e) { }
}
これを終えて、ビューの初期化時にこのオブジェクトをインスタンス化します.
mGestureDetector = new GestureDetector(context, new MGestureListener());
またonDrawでの操作も行います
@Overrideprotected
void onDraw(Canvas canvas) {
super.onDraw(canvas);
bitmapDraw = bitmapRegionDecoder.decodeRegion(mRect, mOptions);
canvas.drawBitmap(bitmapDraw, 0, 0, null);
}
基本的にコアコードはこれだけで、あといくつかありますが、計算するときにも使うので、必要なものがあれば少し覚えておいてください.
WindowManager manager = (WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics = getResources().getDisplayMetrics();
manager.getDefaultDisplay().getMetrics(metrics);
screenWidth = metrics.widthPixels; //
screenHeight = metrics.heightPixels; //
int height=getSupportActionBar().getHeight(); // toolbar
//
private int getStatusBarHeight() {
try {
Class> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
//
private int getStatusBarHeight(Context context) {
int result = 0;
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = context.getResources().getDimensionPixelSize(resourceId);
}
return result;
}
よし、これで大成功だ.githubコードアドレス