当前位置:首页 » 安卓系统 » android图片滚动

android图片滚动

发布时间: 2025-04-11 04:23:13

⑴ android中如何将图片变为圆角

方法一:使用框架CircleImageView,这是直接使用圆形/圆角的ImageView

方法二:使用图片加载框架Glide,这是使用正常的ImageView,在加载图片的时候进行圆形/圆角处理。

java">GlideApp.with(this).load("http://123.jpg").circleCrop().into(imageView)
GlideApp.with(this).load("http://123.jpg").transform(newGlideRoundTransform(context,10)).into(imageView)

⑵ Android 开发中如何利用拖动的方式显示高清图片

在Android开发中,面对大尺寸图片的显示需求,如世界地图或微博长图,传统的图片加载方式无法满足完整显示而避免内存溢出问题。为解决此难题,关键在于采用拖动方式逐次加载图片的局部区域,以此实现高清晰度图片的流畅显示。


首先,理解到大图片的挑战在于内存管理和显示效率。为避免一次性加载整个图片导致的内存问题,应采取分块加载策略。利用BitmapRegionDecoder类,我们能够有效加载图片的特定矩形区域,无需一次性将图片加载到内存中,确保资源利用效率。


使用BitmapRegionDecoder时,可通过其newInstance方法创建实例,支持文件路径、描述符或数据流等多种输入形式。加载指定区域时,调用decodeRegion方法,通过传入加载区域和BitmapFactory.options,可灵活控制解码格式、取样率等参数。


在自定义的加载高清大图控件中,我们运用了上述技术实现。通过监听控件滑动事件,获取滑动方向与距离,动态加载并显示图片的相应局部。在实现时,自定义控件需重写onDraw方法,将加载的Bitmap绘制至屏幕上,从而实现拖动显示整个高清图片的效果。


总结而言,解决Android中大尺寸图片的显示问题,主要通过以下步骤:



  1. 利用BitmapRegionDecoder类加载图片的特定区域,实现内存高效管理。


  2. 监听控件滑动事件,根据用户操作动态加载图片的局部,避免加载过量数据。


  3. 在自定义控件中重写onDraw方法,将加载的Bitmap绘制至控件上,实现拖动显示高清图片的交互体验。



通过上述技术组合,我们能够高效、流畅地在Android应用中展示大尺寸高清图片,满足用户对图片完整、清晰显示的需求。

⑶ android怎么viewpager实现循环切换图片

Android中的ViewPager则实现了左右滑动的效果,ViewPager类提供了多界面切换的新效果。利用ViewPager实现图片循环滚动代码如下:

1、首先是布局文件,使用了一个ViewPager控件:

<spanstyle="padding:0px;margin:0px;font-size:14px;"><RelativeLayoutxmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent">
</android.support.v4.view.ViewPager>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewpager"
android:background="#33000000"
android:orientation="vertical"
android:padding="5dip">
<TextView
android:id="@+id/tv_image_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="第一个引导页面"
android:textColor="@android:color/white"
android:textSize="14sp"/>
<LinearLayout
android:id="@+id/ll_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dip"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout></span>

2、接下来实现一个继承PagerAdapter的MyAdapter类,实现一个PagerAdapter,代码如下:

<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.List;
importandroid.support.v4.view.PagerAdapter;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.ImageView;
{
privateList<ImageView>mImageViewList;
publicViewPagerAdapter(List<ImageView>imageViewList){
super();
this.mImageViewList=imageViewList;
}
/**
*该方法将返回所包含的Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item,
*其实这并非是真正的无限循环。
*/
@Override
publicintgetCount(){
returnInteger.MAX_VALUE;
}
/**
*判断出去的view是否等于进来的view如果为true直接复用
*/
@Override
publicbooleanisViewFromObject(Viewarg0,Objectarg1){
returnarg0==arg1;
}
/**
*销毁预加载以外的view对象,会把需要销毁的对象的索引位置传进来,就是position,
*因为mImageViewList只有五条数据,而position将会取到很大的值,
*所以使用取余数的方法来获取每一条数据项。
*/
@Override
publicvoiddestroyItem(ViewGroupcontainer,intposition,Objectobject){
container.removeView(mImageViewList.get(position%mImageViewList.size()));
}
/**
*创建一个view,
*/
@Override
publicObjectinstantiateItem(ViewGroupcontainer,intposition){
container.addView(mImageViewList.get(position%mImageViewList.size()));
returnmImageViewList.get(position%mImageViewList.size());
}
}
</span>

3、最后是主界面部分的代码:

<spanstyle="padding:0px;margin:0px;font-size:14px;">packagecom.example.viewpagertest;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.os.Bundle;
importandroid.os.Handler;
importandroid.os.Message;
importandroid.os.SystemClock;
importandroid.support.v4.view.ViewPager;
importandroid.support.v4.view.ViewPager.OnPageChangeListener;
importandroid.view.View;
importandroid.widget.ImageView;
importandroid.widget.LinearLayout;
importandroid.widget.LinearLayout.LayoutParams;
importandroid.widget.TextView;

{

privateList<ImageView>imageViewList;
privateTextViewtvDescription;
privateLinearLayoutllPoints;
privateString[]imageDescriptions;
=0;
privateViewPagermViewPager;
privatebooleanisLoop=true;
privateHandlerhandler=newHandler(){

@Override
publicvoidhandleMessage(Messagemsg){
super.handleMessage(msg);

mViewPager.setCurrentItem(mViewPager.getCurrentItem()+1);
}
};

@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setView();
initView();
}

publicvoidsetView(){
setContentView(R.layout.activity_splash_viewpager);

//自动切换页面功能
newThread(newRunnable(){

@Override
publicvoidrun(){
while(isLoop){
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
}
}).start();
}

publicvoidinitView(){
mViewPager=(ViewPager)findViewById(R.id.viewpager);
tvDescription=(TextView)findViewById(R.id.tv_image_description);
llPoints=(LinearLayout)findViewById(R.id.ll_points);

prepareData();

ViewPagerAdapteradapter=newViewPagerAdapter(imageViewList);
mViewPager.setAdapter(adapter);
mViewPager.setOnPageChangeListener(this);

tvDescription.setText(imageDescriptions[previousSelectPosition]);
llPoints.getChildAt(previousSelectPosition).setEnabled(true);

/**
*2147483647/2=1073741820-1
*设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动
*/
intn=Integer.MAX_VALUE/2%imageViewList.size();
intitemPosition=Integer.MAX_VALUE/2-n;

mViewPager.setCurrentItem(itemPosition);
}

privatevoidprepareData(){
imageViewList=newArrayList<ImageView>();
int[]imageResIDs=getImageResIDs();
imageDescriptions=getImageDescription();

ImageViewiv;
Viewview;
for(inti=0;i<imageResIDs.length;i++){
iv=newImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);

//添加点view对象
view=newView(this);
view.setBackgroundDrawable(getResources().getDrawable(R.drawable.point_background));
LayoutParamslp=newLayoutParams(5,5);
lp.leftMargin=10;
view.setLayoutParams(lp);
view.setEnabled(false);
llPoints.addView(view);
}
}

privateint[]getImageResIDs(){
returnnewint[]{
R.drawable.bg1,
R.drawable.bg2,
R.drawable.bg3,
R.drawable.pic_01,
R.drawable.pic_02
};
}

privateString[]getImageDescription(){
returnnewString[]{
"第一个引导页面",
"第二个引导页面",
"第三个引导页面",
"第四个引导页面",
"第五个引导页面"
};
}
@Override
(intarg0){

}
@Override
publicvoidonPageScrolled(intarg0,floatarg1,intarg2){

}
@Override
publicvoidonPageSelected(intposition){
//改变图片的描述信息
tvDescription.setText(imageDescriptions[position%imageViewList.size()]);
//切换选中的点,把前一个点置为normal状态
llPoints.getChildAt(previousSelectPosition).setEnabled(false);
//把当前选中的position对应的点置为enabled状态
llPoints.getChildAt(position%imageViewList.size()).setEnabled(true);
previousSelectPosition=position%imageViewList.size();
}
@Override
protectedvoidonDestroy(){
super.onDestroy();
isLoop=false;
}
}
</span>

⑷ Android自定义控件之可平移、缩放、旋转图片控件

先上效果图

源码

单点拖动图片对图片进行平移操作。双手缩放图片大小和旋转图片到一定的角度。图片缩放的时候 不能大于最大的缩放因子和小于最小的缩放因子。大于最大缩放因子或者小于最小缩放因子需要对图像进行回弹。图片旋转的角度只能为90度的倍数,不满足90度要进行回弹。图片回弹要一个渐变的效果。

大体思路: 首先,Android中提供了Matrix类可以对图像进行处理。其次,要显示一张图片最容易想到的就是ImageView。回弹要求渐变的过程,可以通过属性动画进行设置。所以大体的思路是:继承ImageView,重写onTouchEvent()方法,判断事件类型,在对应的事件使用Matrix对图像进行变换。
Matrix是一个已经封装好的矩阵,最重要的作用就是对坐标点进行变换。
举个栗子:
1.某个点(x0,y0,1)通过单位矩阵E映射得到的点还是(x0,y0,1)。

3.点(x0,y0,1)通过矩阵T映射得到的点就会做如下的变换

可以看到点(x0,y0,1)经过T矩阵在x轴方向上平移了dx,在y轴方向上平移了dy。

通过以上的变换可以得到具体的思路: 我们维护一个图像对应的矩阵mCurrentMatrix,该矩阵主要是对ImageView中的图像的各个点进行映射。ImageView在容器位置摆放完成之后,置mCurrentMatrix矩阵为单位矩阵。当onTouchEvent()方法中触发单点触控并且手指进行平移的时候,调用矩阵mCurrentMatrix的postTranslate(dx,dy),对mCurrentMatrix进行变换。当手指抬起,利用变换结束后的矩阵对图像的各个点进行映射,从而得到平移变换后的图像。同理可得,在两只手指进行缩放旋转的时候,我们对矩阵mCurrentMatrix进行各种变换,当缩放旋转的事件结束再利用变换完的矩阵去映射图像的各个点,从而得到缩放、旋转后的图像。

安卓自定义View进阶 - Matrix原理
安卓自定义View进阶 - Matrix详解

首先理清事件的逻辑:

初始化图像大小和位置

缩放图像大小和控件大小自适应,平移图像中心和控件中心重合

onTouchEvent()函数

平移操作

将图像对应的矩阵进行变换。

缩放操作

mBoundRectF为记录图像边界的矩形。缩放的时候选取图像的中心进行缩放。

旋转操作

旋转的时候旋转的旋转中心也是图像的中心

图像中各个点的映射

调用ImageView的setImageMatrix(Matrix matrix)会让ImageView根据设置的matrix去重新绘制图像。

更新图像的矩形边界

获得图像的矩形,并根据矩阵映射矩形各个点的坐标。

缩放回弹

旋转回弹

一些计算方法

要求图像的变换是一个渐变的过程,很容易想到的就是属性动画。因为属性动画本身就是对值进行不断set的过程。而我们维护的矩阵也是一个值,所以很自然可以想到,如果得到回弹之前的矩阵的值以及回弹之后矩阵的值,就可以根据动画监听器中动画当前的系数值去改变矩阵的值。

对animator对象设置完监听器之后,就可以在手指抬起的时候调用属性动画的start()方法开启动画。

自定义可平移、缩放、旋转的控件主要点有两个方面:一是onTouchEvent()中判断平移、旋转、缩放的触发条件,平移位移量、缩放比例因子、旋转角度的计算。二是Matrix矩阵的应用。

⑸ 安卓怎样锁定照片不左右滑动

以小米手机为例,在小米手机图库照片锁定中“设置-显示-其他高级设置-自动屏幕旋转”中设置自动旋转,在图库中设置自动旋转。

2010年10月,谷歌宣布Android系统达到了第一个里程碑,即电子市场上获得官方数字认证的Android应用数量已经达到了10万个,Android系统的应用增长非常迅速。在2010年12月,谷歌正式发布了Android 2.3操作系统Gingerbread (姜饼)。

2011年1月,谷歌称每日的Android设备新用户数量达到了30万部,到2011年7月,这个数字增长到55万部,而Android系统设备的用户总数达到了1.35亿,Android系统已经成为智能手机领域占有量最高的系统。

2011年8月2日,Android手机已占据全球智能机市场48%的份额,并在亚太地区市场占据统治地位,终结了Symbian(塞班系统)的霸主地位,跃居全球第一。

2011年9月,Android系统的应用数目已经达到了48万,而在智能手机市场,Android系统的占有率已经达到了43%。继续在排在移动操作系统首位。谷歌将会发布全新的Android 4.0操作系统,这款系统被谷歌命名为Ice Cream Sandwich(冰激凌三明治)。

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:621
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:350
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:65
php微信接口教程 发布:2025-04-16 17:07:30 浏览:290
android实现阴影 发布:2025-04-16 16:50:08 浏览:783
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:335
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:199
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:794
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:352
土压缩的本质 发布:2025-04-16 16:13:21 浏览:579